我想玩編譯時在C++編譯器中合成常量字符串哈希值的奇特遊戲。這可以讓我用一個標識符替換字符串,大大節省了代碼的大小和複雜性。是一個編譯時常量索引編譯時常量數組本身編譯時常量?
爲了編程的清晰和簡單,如果我可以在編譯時使用簡單的內聯字符串(如「Hello」,它們是編譯時常量指針指向編譯時常量字符)進行檢查和計算,那將非常棒。
如果我可以在編譯時編入索引,我可以創建一個模板元程序來執行我想要的操作。但目前還不清楚C++標準本身是否將ct常數數組的ct常數索引視爲ct常數。
問另一種方式,
const char v="Hello"[0];
是相當有效的C++(和C)。但是是一個編譯時間常量的值嗎?
我已經相信答案是否定的,但實際上一些編譯器接受它,甚至沒有任何警告,更少的錯誤。例如,從英特爾C++編譯器下面的編譯和運行,甚至沒有一個警告:
#include <iostream>
const char value="Hello"[0];
template<char c> void printMe()
{
std::cout << "Template Val=" << c << std::endl;
}
int main()
{
const char v='H';
printMe<'H'>();
printMe<v>();
printMe<value>(); // The tricky and interesting case!
}
然而,微軟的編譯器將不能編譯,提供有關使用模板與內部對象的合理連貫的錯誤信息連鎖。
我懷疑我的問題的答案是「不,你不能假定任何數組引用,即使是在編譯時常量索引常量的常量數組」。這是否意味着英特爾編譯器的成功執行是英特爾編譯器中的一個錯誤?
聰明的黑客宏使用stringize宏觀操作者特性化原料字符!當然,這對嘗試使用模板參數沒有多大幫助。除非可變參數樣式的宏(C99 ??)可以去掉一個char,否則建立一個新的typedef並將其餘的var參數包含爲遞歸類型a-la Loki? – SPWorley 2009-04-20 08:00:17