如何在bitset上完成C ++ 11编译时静态成员初始化?

时间:2017-03-24 23:56:05

标签: c++ c++11 templates static bitset

我正在尝试执行以下操作:

假设我有一个类A,并且我有一个静态成员变量static_bit_id,它是一个bitset< 128>。在编译时,我想使用bitset创建一个ID,这是我选择的一个热点。我有一个函数可以为我执行onehotbits(int n)。例如:

bitset<128> b = onehotbits(4) // 0....01000

在编译时,我想以这样的方式分配给A类的静态成员:

//in A.h
class A{
public:
    const static bitset<128> bits;
};

// in A.cpp
const bitset<128> A::bits = onehotbits(1);

以前这种模式使用constexpr函数,而不是bitset,使用uint64_t并移位它们。现在对bitset执行相同操作会违反constexpr规则,因为 运算符&lt;&lt; bitset&lt; T&gt; 不是constexpr。

我无法想到使用constexpr实现这一目标的方法,或者通常使用命名空间安全方式。我可以初始化bitset&lt; 128&gt;用字符串,但违反constexpr。

我目前正在解决这个问题:

const bitset<128> A::bits = bitset<128>(1) >> n;

似乎违反了DRIP,摆脱这个问题的唯一方法似乎是使用MACRO,如果我可以使用&gt;&gt;则不需要MACRO。 bitset的运算符。

注意我想避免使用其他库,尤其是不使用boost,这是过度的。

请注意,虽然我的问题类似于Initializing c++ std::bitset at compile time但它不一样,因为那里的解决方案对我的问题不起作用(因为我不是简单地使用文字,而是文字必须通过一些输入在编译时创建)

1 个答案:

答案 0 :(得分:-1)

这会解决您的问题吗?

git clone (here link to bitbucket)

通过

调用它
constexpr auto onehotbits(int i)
{
    return 1<<(i-1);
}

class A{
public:
    constexpr static std::bitset<128> bits{onehotbits(4)};
};

constexpr std::bitset<128> A::bits;

产量

int main()
{
    for(int i=0;i<128;++i)
    {
        std::cout<<A::bits[i]<<" ";   
    }
}

DEMO

关于移位运算符是0 0 0 1 0 0 0 0 ... 的问题,请参阅here。到目前为止还没有得到...如果没有,可以通过模板类获得相同的行为。