c++ - 如何检查模板参数是否为 2 的幂?

标签 c++ templates c++11 constexpr static-assert

我想创建一个静态分配 2^N 字节 数组的结构,但我不希望该结构的用户将此大小指定为指数。示例:

my_stupid_array<char, 32> a1; // I want this!
my_stupid_array<char, 5> a2; // And not this...

如何检查此模板参数是否为 2 的幂向用户发出关于此的好消息?

我已经能够使用一个简单的模板来检查这一点:

template<int N>
struct is_power_of_two {
    enum {val = (N >= 1) & !(N & (N - 1))};
};

但是,我无法用理智的消息警告用户。有什么想法吗?

编辑

修正了模棱两可的例子。

编辑

1 确实是 2 的幂。解决了这个问题! :)

编辑

使用 BOOST_STATIC_ASSERT,我在 GCC 中收到此代码的编译错误:

template<int N>
struct is_power_of_two {
    enum {val = (N >= 1) & !(N & (N - 1))};
    BOOST_STATIC_ASSERT(val);
};

错误

..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' 

http://ideone.com/cMfEf

编辑

哦,我明白了。这是断言失败时我应该得到的消息。但这并没有给用户一些理智的信息。 :(

最佳答案

如今,使用 constexprbit twiddling hacks你可以

constexpr bool is_powerof2(int v) {
    return v && ((v & (v - 1)) == 0);
}

关于c++ - 如何检查模板参数是否为 2 的幂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10585450/

相关文章:

c++ - 在 C++ 中同时读取大量文件的最佳方法是什么?

c++ - 具有单个参数的模糊构造函数 : initializer_list and int

c++ - 此示例中使用的运算符 "<"在哪里?

c++ - 如何在 C++ 中删除 float

c++ - bool 后缀表示法

c++ - 使用特征时避免部分模板特化中的函数定义重复

c++ - 将 GetVersionEx 数字转换为操作系统名称

c++ - 派生类的模板参数推导

c++ - 如何传递具有可变参数的成员函数作为模板参数?

c++ - 一些 std::unique_ptr 使用和 "gotchas"