[英]std::bitset constexpr >64bit value
我想在我的程序中有一個 bitset constexpr 變量。 bitset 可以將 unsigned long long 值作為 64 位值的構造函數,我需要 100 位值。 根據這個問答,我們可以使用將字符串作為參數的構造函數並以這種方式對其進行初始化,但它不會是 constexpr 值。 有什么辦法嗎?
構造函數std::bitset<N>(uint64_t)
是這里唯一有用的constexpr
可調用構造函數:
constexpr bitset(unsigned long long _Val) noexcept : _Array{static_cast<_Ty>(_Need_mask ? _Val & _Mask : _Val)} {}
那只會提供 64 位的信息。
但是由於可以在編譯時用另一個std::bitset
初始化一個 std::bitset ,理論上你可以創建一個constexpr
function 來初始化一個std::bitset
std::bitset
並返回它,如下所示:
template<size_t N>
constexpr std::bitset<N> make_bitset(const char* x) {
std::bitset<N> result;
for (int i = 0; x && x[i] != '\0'; ++i) {
result.set(i, x[i] - '0');
}
return result;
}
遺憾的是,這不會編譯為std::bitset<N>::set
未聲明為constexpr
。 但是看看set
function,理論上這個 function 可以聲明為constexpr
:
bitset& _Set_unchecked(size_t _Pos, bool _Val) noexcept { // set bit at _Pos to _Val, no checking
auto& _Selected_word = _Array[_Pos / _Bitsperword];
const auto _Bit = _Ty{1} << _Pos % _Bitsperword;
if (_Val) {
_Selected_word |= _Bit;
} else {
_Selected_word &= ~_Bit;
}
return *this;
}
但在那之前,您無法在編譯時使用超過 64 位的信息初始化std::bitset
。
不幸的是, constexpr
std::bitset
的構造函數僅限於
unsigned long long
。 此外,它的修改器( set
, operator[]
,...)也不是constexpr
,所以你不能創建一個constexpr
"factory" 。
您必須創建自己的位集(或使用另一個庫中的位集)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.