Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何扩展函数 在现代C++中有没有一种方法来扩展函数? 也许这个伪代码可以解释我想要什么: extendable void foo() { doSomething(); } extend foo() { moo(); }_C++_Function_Oop - Fatal编程技术网

如何扩展函数 在现代C++中有没有一种方法来扩展函数? 也许这个伪代码可以解释我想要什么: extendable void foo() { doSomething(); } extend foo() { moo(); }

如何扩展函数 在现代C++中有没有一种方法来扩展函数? 也许这个伪代码可以解释我想要什么: extendable void foo() { doSomething(); } extend foo() { moo(); },c++,function,oop,C++,Function,Oop,编译时,函数foo应执行以下操作: foo() { doSomething(); moo(); } 我想我可以通过将我想在foo中拥有的每个函数存储在函数指针的std::vector中来实现这一点,foo将循环遍历该向量并运行所有函数 但是,我需要在编译时执行此操作,因此无法运行vector.push_ 我试图在define指令的帮助下实现这一点,但没有找到解决方案 提前感谢您的回答 编辑:我的实际问题 我想实现某种实体组件系统,每个组件都有一个列表。每个实体都有一个ID,该I

编译时,函数foo应执行以下操作:

foo()
{
    doSomething();
    moo();
}
我想我可以通过将我想在foo中拥有的每个函数存储在函数指针的std::vector中来实现这一点,foo将循环遍历该向量并运行所有函数

但是,我需要在编译时执行此操作,因此无法运行vector.push_

我试图在define指令的帮助下实现这一点,但没有找到解决方案

提前感谢您的回答

编辑:我的实际问题 我想实现某种实体组件系统,每个组件都有一个列表。每个实体都有一个ID,该ID指向组件列表中的列表元素。 因为我不想重复创建新类型组件的步骤,所以我想创建一个define指令,以便为我要创建的每个新组件自动执行此操作

主要的问题是,如果创建了一个新的实体,则要向每个组件向量添加一个元素。 这是我想使用的代码:

#define addComponent(name)                                          \
    struct name;                                                    \
private:                                                            \
    std::vector<name> name ## vector;                               \
public:                                                             \
    extend addEntity()                                              \
    {                                                               \
        struct name a;                                              \
        name ## vector.push_back(a);                                \
    }                                                               \
    void set ## name(const int & ID, name newName)                  \
    {                                                               \
        name ## vector[ID] = newName;                               \
    }                                                               \
    name get ## name(const int & ID)                                \
    {                                                               \
        return name ## vector[ID];                                  \
    }

class Component
{
public:
    Component();
    ~Component();

    extendable void addEntity(int * ID);

    addComponent(position)
    struct position
    {
        float x, y, z;
    }
};
我可以扩展函数吗

没有

你所描述的是不可能的。任何机制都不支持让编译器生成一个函数来调用foo在扩展之前调用的函数

虚拟方法不起作用,因为它们提供的只是希腊语中的多种形式

我可以扩展函数吗

没有

你所描述的是不可能的。任何机制都不支持让编译器生成一个函数来调用foo在扩展之前调用的函数


虚拟方法不起作用,因为它们提供的只是希腊语中的多种形式

即使在编辑之后,你也没有充分解释你的想法和原因。对于成员函数,请阅读更多有关实现的常用方法的信息

但是请注意,函数可以是值,这要归功于,尤其是

然后,您可能会声明一个双端队列来处理使用它的函数,它可能是一个静态变量或某个类的字段,等等

并用

  todoque{[](void){doSomething()}};
然后编码

 void foo() {
   for (auto f : todoque) f();
 }
我希望你明白了

顺便说一句,在上面的示例中,可能不需要lambda,您可能只需要编写todque.push_backmoo

我推荐阅读而不是C++,但是关于一个叫做Stand的函数式编程语言,它是一个优秀的、可自由下载的编程入门。 我想我可以通过将我想在foo中拥有的每个函数存储在函数指针的std::vector中来实现这一点

不,或者更好,将其设置为std::vector并使用lambda表达式

但是,我需要在编译时执行此操作,因此无法运行vector.push_

为什么不呢?它可能发生在一些静态数据的构造函数中

也许您没有解释的总体目标也可以通过运行时元编程技术实现,包括在运行时生成代码。你可以使用像或;您还可以在某些临时文件中发出C++代码,将其编译为插件和插件。另见


关于你编辑的实体组件系统的目标,你是否考虑编写一些专门的C++代码生成器或预处理器来处理你的构建自动化系统的规则,例如make或忍者等等…是否会在构建时明智地触发?Qt可能是鼓舞人心的。也可以考虑使用一些通用的预处理器,比如M4或.< /P> < P>你没有解释足够的想法,甚至在编辑之后。对于成员函数,请阅读更多有关实现的常用方法的信息

但是请注意,函数可以是值,这要归功于,尤其是

然后,您可能会声明一个双端队列来处理使用它的函数,它可能是一个静态变量或某个类的字段,等等

并用

  todoque{[](void){doSomething()}};
然后编码

 void foo() {
   for (auto f : todoque) f();
 }
我希望你明白了

顺便说一句,在上面的示例中,可能不需要lambda,您可能只需要编写todque.push_backmoo

我推荐阅读而不是C++,但是关于一个叫做Stand的函数式编程语言,它是一个优秀的、可自由下载的编程入门。 我想我可以通过将我想在foo中拥有的每个函数存储在函数指针的std::vector中来实现这一点

不,或者更好,将其设置为std::vector并使用lambda表达式

但是,我需要在编译时执行此操作,因此无法运行vector.push_

为什么不呢?它可能发生在一些静态数据的构造函数中

也许您没有解释的总体目标也可以通过运行时元编程技术实现,包括在运行时生成代码。你可以使用像或;您还可以在某些临时文件中发出C++代码,将其编译为插件和插件。另见

关于您编辑的实体组件系统目标,您考虑过
编写一些专门的C++代码生成器或预处理器来处理你的构建自动化系统的规则,例如make或忍者等等。是否会在构建时明智地触发?Qt可能是鼓舞人心的。还可以考虑使用一些通用的预处理器,如M4或.</P>这称为虚拟方法。它不是现代的,但这是从C++诞生以来就存在的。让我们回到一个步骤——为什么你需要这个?这看起来像是一个.dauluuSeDeSeNeb.:请编辑你的问题来激励它,解释你为什么要做这些事情,以及什么样的程序。你的宏显然不工作,不能工作。那么,你怎么考虑解决你的问题,即使在编辑之后,我仍然觉得很不清楚?这就是所谓的虚拟方法。它不是现代的,但这是从C++诞生以来就存在的。让我们回到一个步骤——为什么你需要这个?这看起来像是一个.dauluuSeDeSeNeb.:请编辑你的问题来激励它,解释你为什么要做这些事情,以及什么样的程序。你的宏显然不工作,不能工作。那么,你怎么考虑解决你的问题呢?即使在编辑之后,我仍然觉得很不清楚。我看不出虚拟方法是如何与问题描述的任何方式相媲美的。但是虚拟函数需要是成员函数,即应用于对象的方法。还可以阅读关于不能用虚拟函数扩展函数的内容。你可以覆盖它们,仅此而已。根据上下文,虚拟函数可能会解决他的问题,但我们还不知道他的问题是什么。让我们希望他澄清一下。我看不出虚拟方法在任何方面与问题所描述的有什么可比性。但虚拟函数需要是成员函数,即应用于对象的方法。还可以阅读关于不能用虚拟函数扩展函数的内容。你可以覆盖它们,仅此而已。根据上下文,虚拟函数可能会解决他的问题,但我们还不知道他的问题是什么。让我们希望他澄清一下。如果我不能用预处理器指令找到解决方案,我需要的可能是一个专门的代码生成器。如果我不能用预处理器指令找到解决方案,我需要的可能是一个专门的代码生成器。