C++ 模板参数的条件数值约束

C++ 模板参数的条件数值约束,c++,c++11,C++,C++11,我有一个数据结构/容器模板,该模板针对2次方的大小进行了优化,除非大小参数为2次方,否则无法正常工作 template <typename T, unsigned int __pow2int> class CustomContainer { } 完全令人困惑,我甚至不确定这是否是我试图实现的目标的方式,我完全迷失了尝试遵循常见问题 在我看来,也许我应该声明一个只创建2个整数幂的用户定义类型,并将其用作模板类型 我试图实现它,但最终得到了一个“非类型模板参数不能…”错误 class

我有一个数据结构/容器模板,该模板针对2次方的大小进行了优化,除非大小参数为2次方,否则无法正常工作

template <typename T, unsigned int __pow2int>
class CustomContainer {
}
完全令人困惑,我甚至不确定这是否是我试图实现的目标的方式,我完全迷失了尝试遵循常见问题

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

我试图实现它,但最终得到了一个“非类型模板参数不能…”错误

class intb2{
const std::uint32\u t\u输出;
公众:
intb2(标准::uint8位):\u输出([&](){
uint8\u t rbit=(位==0)?1:位;
标准:uint32_t i=1;

return(i解决这个问题的最简单方法是使用指数作为参数

template <typename T, unsigned int exp>
class CustomContainer
{
    unsigned int __pow2int = 1<<exp;

};
模板
类自定义容器
{

unsigned int uu pow2int=1检查一个数
x
是否是二的幂的常用技巧是按位计算,并使用
x-1
检查结果是否为零:

x != 0 && (x & (x−1)) == 0
现在把它用在一个

模板
类自定义容器{
静态断言(N!=0&(N&(N))−1) )==0,“不是二的幂!”;
};

不要使用带有两个连续下划线的名称。这些名称是保留的。请参阅
template <typename T, unsigned int exp>
class CustomContainer
{
    unsigned int __pow2int = 1<<exp;

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