簡體   English   中英

std::bitset constexpr >64 位值

[英]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

此外,它的修改器( setoperator[] ,...)也不是constexpr ,所以你不能創建一個constexpr "factory"

您必須創建自己的位集(或使用另一個庫中的位集)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM