我正在尝试使用元编程技术创建一个编译时位掩码,我的想法是创建这样的东西:
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>());
}
}
返回 1;
但这会导致成对的警告:
- 警告 C4554:“<<”:检查运算符优先级是否存在可能的错误
- 警告 C4293:“<<”:移位计数为负数或太大
最后,编译错误:
- 错误 C1202:递归类型或函数依赖上下文太复杂。
所以,我推断递归永远不会结束并陷入编译器无限循环,但我不明白为什么。