2013-03-11 94 views
0

我试图用宏来创建一些静态变量。将模板宏定义为变量

我的问题是,我该如何定义一个具有2个参数的宏,第一个是模板,第二个是静态变量。模板应该有多于一种类型。

例如:

#define macro(x, y, z, v) x::y z = v; 

int main(int argc, char *argv[]) { 
    // this works 
    macro(std::queue<int>, value_type, test, 4) 
    // this also works 
    std::pair<int, int>::first_type x = 3; 

    // this is produsing some compiler errors 
    macro(std::pair<int, int>, first_type, test2, 4) 

    return 0; 
} 

,是它甚至有可能做到这一点?

这里是错误:

main.cpp(47) : warning C4002: too many actual parameters for macro 'macro' 
main.cpp(47) : error C2589: 'int' : illegal token on right side of '::' 
main.cpp(47) : error C2589: 'int' : illegal token on right side of '::' 
main.cpp(47) : error C2143: syntax error : missing ',' before '::' 
main.cpp(50) : error C2143: syntax error : missing ';' before '}' 
main.cpp(51) : error C2143: syntax error : missing ';' before '}' 

由约阿希姆Pileborg

#define macro(x, y, z, v, ...) x<__VA_ARGS__>::y z = v; 
... 

// now it works 
macro(std::pair, first_type, test2, 4, int, int) 

THX约阿希姆

+0

你可以粘贴你得到的编译器错误吗? – 2013-03-11 15:06:20

回答

2

这是因为,处理宏预处理程序是相当愚蠢的启发。它在第二个宏“call”中看到五个参数,第一个是std::pair<int,第二个是int>。你不能有包含逗号的宏参数。

您可能想要查看variadic macros,并重新排列,以便该类在宏中最后一个。

2

这不是一个真正的解决方案,但只是一个变通:

#define COMMA , 

macro(std::pair<int COMMA int>, first_type, test2, 4) 

还是有点更具可读性:

#define wrap(...) __VA_ARGS__ 

macro(wrap(std::pair<int, int>), first_type, test2, 4) 
2

有一对夫妇的方式来摆脱顶的级别逗号。

typedef std::pair<int, int> int_pair; 
macro(int_pair, first_type, test2, 4) 

macro((std::pair<int, int>), first_type, test2, 4); 

#define macro2(x1, x2, y, z, v) x1, x2::y z = v; 
macro2(std::pair<int, int> first_type, test2, 4) 

顺便说一句,我会离开关从宏观的;,并用它在任何地方使用的宏。这使得代码看起来更自然。