如何扩展函数 在现代C++中有没有一种方法来扩展函数? 也许这个伪代码可以解释我想要什么: extendable void foo() { doSomething(); } extend foo() { moo(); }
编译时,函数foo应执行以下操作:如何扩展函数 在现代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()
{
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.:请编辑你的问题来激励它,解释你为什么要做这些事情,以及什么样的程序。你的宏显然不工作,不能工作。那么,你怎么考虑解决你的问题呢?即使在编辑之后,我仍然觉得很不清楚。我看不出虚拟方法是如何与问题描述的任何方式相媲美的。但是虚拟函数需要是成员函数,即应用于对象的方法。还可以阅读关于不能用虚拟函数扩展函数的内容。你可以覆盖它们,仅此而已。根据上下文,虚拟函数可能会解决他的问题,但我们还不知道他的问题是什么。让我们希望他澄清一下。我看不出虚拟方法在任何方面与问题所描述的有什么可比性。但虚拟函数需要是成员函数,即应用于对象的方法。还可以阅读关于不能用虚拟函数扩展函数的内容。你可以覆盖它们,仅此而已。根据上下文,虚拟函数可能会解决他的问题,但我们还不知道他的问题是什么。让我们希望他澄清一下。如果我不能用预处理器指令找到解决方案,我需要的可能是一个专门的代码生成器。如果我不能用预处理器指令找到解决方案,我需要的可能是一个专门的代码生成器。