C++ C++;常量预处理器宏和模板
假设我有以下非常简单的宏,以及一些输出它的代码:C++ C++;常量预处理器宏和模板,c++,templates,macros,c-preprocessor,C++,Templates,Macros,C Preprocessor,假设我有以下非常简单的宏,以及一些输出它的代码: #define SIMPLEHASH(STRING) STRING[1] + STRING[2] + STRING[3] std::cout << SIMPLEHASH("Blah"); 然后,下面将很好地打印数字32: Printer<32> p; p.Print(); 打印机p; p、 打印(); 这两种方法都是单独工作的,当您尝试将它们结合起来时,问题就出现了: #define SIMPLEHASH(STR
#define SIMPLEHASH(STRING) STRING[1] + STRING[2] + STRING[3]
std::cout << SIMPLEHASH("Blah");
然后,下面将很好地打印数字32:
Printer<32> p;
p.Print();
打印机p;
p、 打印();
这两种方法都是单独工作的,当您尝试将它们结合起来时,问题就出现了:
#define SIMPLEHASH(STRING) STRING[1] + STRING[2] + STRING[3]
Printer<SIMPLEHASH("Blah")> p;
p.Print();
#定义SIMPLEHASH(字符串)字符串[1]+字符串[2]+字符串[3]
打印机p;
p、 打印();
在visual studio中,这将提供:
1> .\ShiftCompare.cpp(187):错误C2975:“X”:对于“打印机”的模板参数无效,应为编译时常量表达式1> .\ShiftCompare.cpp(127):参见“X”的声明 尽管可以在编译时将
SIMPLEHASH(“Blah”)
简化为常量,如第一个示例所示
那么,有什么方法可以告诉编译器“首先计算这个”?模板是否在预处理器评估中自然地“在”宏之前
有人看到我可以让这两个一起工作的方法了吗?宏是在源代码完全解析之前进行评估的,预处理与模板没有任何关系
问题是,用于实例化打印机的模板参数必须是常量表达式,并且不能在常量表达式中使用字符串文字。预处理器是一个麻烦。根据语言,
“Blah”[0]
不是一个常量表达式;就这样。仅仅因为你的编译器碰巧发现了它并不意味着什么。(这就是获取特定于实现的结果的问题,并且假设它是由语言保证的。)要回答“我如何才能让这两个工具一起工作?”部分,如果您能够解释您试图解决的实际问题,那将是很有帮助的。如果你不能真正做到这两件事一起工作,你也许可以通过其他方法来解决你的问题。我们正在尝试使用哈希函数来创建别名(在编译时)以便在工厂类中注册。我试图为需要注册的类提供一个静态(模板类)成员s.t。该成员可以在调用其构造函数时注册其拥有的类(静态,在代码加载时立即注册)。另一种明显的方法是使用全局成员而不是静态成员,这很好,我只是想看看是否有一种方法不让全局成员在名称空间中四处游荡。
Printer<32> p;
p.Print();
#define SIMPLEHASH(STRING) STRING[1] + STRING[2] + STRING[3]
Printer<SIMPLEHASH("Blah")> p;
p.Print();