簡體   English   中英

C ++常量預處理器宏和模板

[英]C++ Constant preprocessor macros and templates

所以說我有以下非常簡單的宏,以及一些輸出它的代碼:

#define SIMPLEHASH(STRING) STRING[1] + STRING[2] + STRING[3]
std::cout <<  SIMPLEHASH("Blah");

這輸出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)] 

其中135h很好地轉換成309小數。 一切都被編譯成一個常數。


現在,假設你有一個模板類:

template<int X> class Printer{
public:
 void Print(){
  std::cout << X;
 }
};

然后以下將很好地打印數字32:

Printer<32> p;
p.Print();

這兩件事都是單獨的,當你試圖將它們組合起來時就會出現問題:

#define SIMPLEHASH(STRING) STRING[1] + STRING[2] + STRING[3]
 Printer<SIMPLEHASH("Blah")> p;
 p.Print();

在visual studio中,這給出了:

1>。\\ ShiftCompare.cpp(187):錯誤C2975:'X':'Printer'的模板參數無效,預期的編譯時常量表達式
1>。\\ ShiftCompare.cpp(127):看'X'的聲明

盡管SIMPLEHASH("Blah")可以在編譯時減少到常量,如第一個例子中所示。

那么,有什么方法可以告訴編譯器“先評估一下”? 在預處理器評估中自然是“之前”的模板?

有誰看到我可以讓這兩個人一起工作?

在完全解析源之前評估宏,並且預處理與模板沒有任何關系。

問題是您實例化Printer的模板參數必須是常量表達式,並且不能在常量表達式中使用字符串文字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM