Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;常量预处理器宏和模板_C++_Templates_Macros_C Preprocessor - Fatal编程技术网

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();