gpt4 book ai didi

c++ - 编译时位掩码的递归模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:09:51 25 4
gpt4 key购买 nike

我正在尝试使用元编程技术创建一个编译时位掩码,我的想法是创建这样的东西:

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:递归类型或函数依赖上下文太复杂。

因此,我推断递归性永远不会结束并陷入编译器无限循环,但我不明白为什么。

最佳答案

正如已经指出的那样,您依赖运行时检查来停止编译时递归,这是行不通的。更重要的是,也许,对于你想做的,你正在定义一个函数,在您调用它之前,它没有任何值(value)。所以即使在你停止具有特化的递归,你仍然有一个嵌套序列函数,将在运行时调用。

如果你想要完整的编译时评估,你必须定义一个静态数据类模板的成员,因为这是编译时的唯一方式常量可以出现在模板中。像这样的东西:

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 . (您可能想将其包装在宏中。)

关于c++ - 编译时位掩码的递归模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11778763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com