Jas*_*son 3 c++ macros templates c-preprocessor
所以说我有以下非常简单的宏,以及输出它的一些代码:
#define SIMPLEHASH(STRING) STRING[1] + STRING[2] + STRING[3]
std::cout << SIMPLEHASH("Blah");
Run Code Online (Sandbox Code Playgroud)
这输出309,如果您查看程序集,您可以看到:
00131094 mov ecx,dword ptr [__imp_std::cout (132050h)]
0013109A push 135h
0013109F call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (13203Ch)]
Run Code Online (Sandbox Code Playgroud)
哪里135h很好地翻译成309十进制.一切都被编译成一个常数.
现在,假设你有一个模板类:
template<int X> class Printer{
public:
void Print(){
std::cout << X;
}
};
Run Code Online (Sandbox Code Playgroud)
然后以下将很好地打印数字32:
Printer<32> p;
p.Print();
Run Code Online (Sandbox Code Playgroud)
这两件事都是单独的,当你试图将它们组合起来时就会出现问题:
#define SIMPLEHASH(STRING) STRING[1] + STRING[2] + STRING[3]
Printer<SIMPLEHASH("Blah")> p;
p.Print();
Run Code Online (Sandbox Code Playgroud)
在visual studio中,这给出了:
1>.\ ShiftCompare.cpp(187):错误C2975:'X':'Printer'的模板参数无效,预期编译时常量表达式
1>.\ ShiftCompare.cpp(127):参见'X'的声明
尽管SIMPLEHASH("Blah")可以在编译时将其简化为常量,如第一个示例所示.
那么,有什么方法可以告诉编译器"先评估一下"?在预处理器评估中自然是"之前"的模板?
有谁看到我可以让这两个人一起工作?