下面的代码使用宏定义新函数
#include <iostream>
#define CONCAT(x, y) x##y
#define PREFIX_COUNTER(prefix, counter) CONCAT(prefix, counter)
#define FUNC() void PREFIX_COUNTER(func_, __COUNTER__)()
FUNC() {
std::cout << "first func" << std::endl;
}
FUNC() {
std::cout << "second func" << std::endl;
}
int main(int, char **) {
func_0();
func_1();
return 0;
}
每次调用FUNC
都会定义一个新的函数,比如func_0
,我现在需要做的是调用func定义的所有函数,如下所示:
int main(int, char **) {
CALL_ALL_FUNC(); // this will call func_0 and func_1
return 0;
}
有没有可能把每个新的FUNC调用的名字附加到一个类似向量的东西上,这样以后我就可以迭代它了?预处理器有这样的东西吗?
3条答案
按热度按时间lymnna711#
你可以做一些可怕的事情,比如下面的代码(只是一个想法的大纲),但是你是否真的要做取决于你自己。
qcbq4gxm2#
既然提到了Catch2,下面是一个基于那里的宏的示例。
FUNC
宏定义一个新的派生类。func->action()
)。qqrboqgw3#
我不完全确定您在这里要做什么,但我不认为宏是正确的方法。
__COUNTER__
在每次出现时都会递增,因此您无法实际检查定义了多少个函数(因为数字会不断递增)。同样,如果您(或库)在其他地方使用它,则无法知道创建了多少个函数以及__COUNTER__
被其他东西递增了多少次。另一个可能的解决方案是创建一个
std::vector
的 * 函数指针 *,你也可以将其与lambda表达式结合,并将其 Package 在一个单例或静态类中,以在某种程度上接近你想要定义的内容:这样,每当你需要创建一个动态函数,而不是使用宏,你会调用
DynamicFunctions::add
。要运行一个函数,而不是调用func_0
,你会把索引传递给DynamicFunctions::call(0)
。这样,因为它都存储在一个std::vector
中,当你需要调用DynamicFunctions::runAll
时,你可以很容易地遍历它们