实际上,您可以部分解决此问题。您可以直接自由地提取C++11的可变参数模板中的每个成员,但是您只能获得第一个元素。例如,假设我们有一个名为
OUT(...)
的宏,并且我们想要生成std::cout << A << B << C ...,其中A、B、C是宏的可变参数。请尝试以下操作:
#include <iostream>
#define SEPERATOR <<
#define GET_1_OF(element1, ...) element1
#define GET_2_OF(element1, ...) element1 SEPERATOR GET_1_OF(__VA_ARGS__)
#define GET_3_OF(element1, ...) element1 SEPERATOR GET_2_OF(__VA_ARGS__)
#define BAR(...) GET_3_OF(__VA_ARGS__)
int main()
{
std::cout << BAR(1,2,3,4,5);
return 0;
}
这当然不是你想要的解决方案。但你可以增加GET_N_OF的数量来实现你想要的效果。请注意,SEPERATOR是<<,因此我们的宏可以写成1 << 2 << 3等等。
现在,我们在这段代码中遇到了一个问题。请将BAR(1,2,3,4,5)更改为BAR(1)。你会发现它会出现错误。这是因为它期望有3个参数,虽然多传递一些参数并不是问题(因为它是可变参数),但我们却多传递了一个SEPERATOR。因此,为了解决这个问题,请使用GET_N_OF(...)而不是BAR(...)(因为你知道参数的数量):
#include <iostream>
#define SEPERATOR <<
#define GET_1_OF(element1, ...) element1
#define GET_2_OF(element1, ...) element1 SEPERATOR GET_1_OF(__VA_ARGS__)
#define GET_3_OF(element1, ...) element1 SEPERATOR GET_2_OF(__VA_ARGS__)
#define GET_4_OF(element1, ...) element1 SEPERATOR GET_3_OF(__VA_ARGS__)
#define GET_5_OF(element1, ...) element1 SEPERATOR GET_4_OF(__VA_ARGS__)
int main()
{
std::cout << GET_5_OF(1,2,3,4,5);
std::cout << GET_1_OF(1);
return 0;
}
请注意,如果您不知道自己在做什么,请不要使用宏!我的回复只是为了分享有趣的宏代码,可能对您有益。在宏确实必要之前,我始终不鼓励使用宏。
static void fooFunction() {
X::do(); \ }我能否使用可变参数模板代替?谢谢 - Kennir