我試圖用metaprograming技術來創建一個編譯時位掩碼遞歸模板,我的想法是創建這樣的:了編譯時位掩碼
unsigned int Mask3 = Mask<2>(); // value = 0x03 = b00000000000000000000000000000011
unsigned int Mask3 = Mask<3>(); // value = 0x07 = b00000000000000000000000000000111
unsigned int Mask3 = Mask<7>(); // value = 0x7F = b00000000000000000000000001111111
我想要的代碼是這樣的:
template <const unsigned int N> const unsigned int Mask()
{
if (N <= 1)
{
return 1;
}
else
{
return ((1 << N) | Mask<N - 1>());
}
}
return 1;
但它導致噸雙警告:
- 警告C4554: '< <':檢查運算符優先級爲可能出現的錯誤
- 警告C4293: '< <':移位計數負或過大
而在最後,編譯錯誤:
- 錯誤C1202:遞歸類型或函數依賴關係上下文過於複雜。
所以,我推斷遞歸永遠不會結束並落入編譯器無限循環,但我不理解爲什麼。
爲什麼你不會像「int result = 0; for(i = 0; i
SinisterMJ
2012-08-02 13:50:26