我正在尝试使用元编程技术创建一个编译时位掩码,我的想法是创建如下内容:
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;
但这会导致大量警告:
最后,编译错误:
- 错误 C1202:递归类型或函数依赖上下文太复杂。
因此,我推断递归永远不会结束并陷入编译器无限循环,但我不明白为什么。
正如已经指出的那样,您依赖于运行时检查来
停止编译时递归,这是行不通的。更重要的是,
也许,你想要做的就是定义一个函数,
在你调用它之前它没有任何价值。所以即使在你停止之后
具有专门化的递归,你仍然有一个嵌套序列
函数,将在运行时调用。
如果你想要完整的编译时评估,你必须定义一个静态数据
类模板的成员,因为这是编译时的唯一方法
常量可以出现在模板中。就像是:
template <unsigned int N>
struct Mask
{
static unsigned int const value = (1 << (N - 1)) | Mask<N - 1>::value;
};
template <>
struct Mask<0>
{
static unsigned int const value = 0;
};
(我还纠正了你弄错的数值。)
当然,您不需要这么复杂的东西。下列
应该做的伎俩:
template <unsigned int N>
struct Mask
{
static unsigned int const value = (1 << (N + 1)) - 1;
};
template <>
struct Mask<0>
{
static unsigned int const value = 0;
};
(您仍然需要对 0 进行专门化。否则,0 表示所有位
放。)
最后,当然:要访问该值,您需要写一些东西
喜欢Mask<3>::value
。 (您可能想将其包装在宏中。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)