gpt4 book ai didi

c++ - 模板参数的条件数值约束

转载 作者:搜寻专家 更新时间:2023-10-31 00:14:35 26 4
gpt4 key购买 nike

我有一个针对 2 的幂大小优化的数据结构/容器模板,除非大小参数是 2 的幂,否则无法正常工作。

template <typename T, unsigned int __pow2int>
class CustomContainer {
}

最好的方法是什么/是否有可能...强制执行编译时检查以确保 __pow2int 是 2 的幂?

我是 C++ 的新手,我一直在看这样的页面:http://www.stroustrup.com/bs_faq2.html#constraints但我发现语法如...

static void constraints(T1 a, T2 b) { T2 c = a; b = a; }
Can_copy() { void(*p)(T1,T2) = constraints; }

完全令人困惑,我什至不确定这是否是实现我想要实现的目标的方法,我在尝试遵循该常见问题解答时完全迷失了方向。

在我看来,也许我应该声明一个用户定义的类型,它只创建 2 个整数的幂并将其用作模板类型?

我尝试实现它,但最终得到了“非类型模板参数不能......”错误。

class intb2 {
const std::uint32_t _output;
public:
intb2(std::uint8_t bit) : _output([&]() {
uint8_t rbit=(bit == 0) ? 1 : bit;
std::uint32_t i=1;
return (i << (rbit-1));
}()) {}

const std::uint32_t& operator()() {
return _output;
}
};

template <typename T, intb2 __pow2int>
class CustomContainer {....

最佳答案

检查数字 x 是否为 2 的幂的常用技巧是按位与 x-1 并查看结果是否为零:

x != 0 && (x & (x−1)) == 0

现在在 static assert declaration: 中使用它

template <typename T, unsigned int N>
class CustomContainer {
static_assert( N != 0 && (N & (N−1)) == 0 , "Not a power of two!");
};

关于c++ - 模板参数的条件数值约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22533634/

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