我正在尝试执行以下操作:
假设我有一个类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但它不一样,因为那里的解决方案对我的问题不起作用(因为我不是简单地使用文字,而是文字必须通过一些输入在编译时创建)
答案 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]<<" ";
}
}
关于移位运算符是0 0 0 1 0 0 0 0 ...
的问题,请参阅here。到目前为止还没有得到...如果没有,可以通过模板类获得相同的行为。