簡體   English   中英

如何在 C++ 中將 std::bitset count() 與 constexpr 一起使用?

[英]How to use std::bitset count() with constexpr in C++?

我想在 constexpr 函數中使用std::bitset<64>(n).count()但 bitset::count 不是 constexpr。 我以為我可以做以下事情:

#include <bitset>

inline constexpr size_t bit_count(uint64_t v) noexcept
{
  if constexpr(true) {
    size_t n = 0;
    while (v) {
      v &= v - 1; // clear right-most 1-bit
      ++n;
    }
    return n;
  }

  return std::bitset<64>(v).count();
}

static_assert(bit_count(42) == 3);

int main(int argc, char **)
{
    return bit_count(argc);
}

重點是我們總是想在運行時使用bitset::count,而while循環替代實現只針對編譯時。

但是在上面的示例中,bit_count(argc) 不是 constexpr 表達式,因此在運行時使用了 while 循環實現。 (見https://godbolt.org/z/W7oj7jnc9

我們如何在運行時強制使用 bitset::count,同時仍然允許在 static_assert 中使用 bit_count?

您可以使用std::is_constant_evaluated()來做到這一點。 那會給你

inline constexpr size_t bit_count(uint64_t v) noexcept
{
  if (std::is_constant_evaluated()) {
    size_t n = 0;
    while (v) {
      v &= v - 1; // clear right-most 1-bit
      ++n;
    }
    return n;
  }

  return std::bitset<64>(v).count();
}

現在if僅在您處於常量表達式中時運行,而在不使用時使用std::bitset::count


你不想做的一件事是使用

if constexpr(std::is_constant_evaluated())

由於if constexpr是一個常量表達式,則std::is_constant_evaluated()將始終為真,並且您將始終輸入 if 語句的主體,這不是您想要的。

在未來的 C++23 中,你可能會這樣做

constexpr size_t bit_count(uint64_t v) noexcept
{
    if consteval {
        size_t n = 0;
        while (v) {
           v &= v - 1; // clear right-most 1-bit
        ++n;
        }
        return n;
    } else {
        return std::bitset<64>(v).count();
    }
}

暫無
暫無

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

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