模板参数的条件数值约束

时间:2014-03-20 12:52:18

标签: c++ c++11

我有一个数据结构/容器模板,针对2的幂大小进行了优化,除非size参数是幂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个整数的幂并将其用作模板类型?

我试图实现它,但我最终得到一个&#34;非类型模板参数不能....&#34;错误。

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 {....

2 个答案:

答案 0 :(得分:5)

检查数字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!");
};

答案 1 :(得分:1)

解决此问题的最简单方法是使用指数作为参数。

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

};