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