编译时布尔值 C++ 未知的 constexpr 函数参数
constexpr function params for not known at compile time booleans C++
我需要 运行 一个带有 N 个布尔变量的函数,我想让它们成为 constexpr 以消除比较并保存分支预测失败的代码。
我的意思是:
templateFunc<b1, b2, b3, b4 ...>(args...);
因为 b1..bn 变量只是布尔变量并且可能只有 2 个状态,所以我可以这样写:
if (b1 && b2)
templateFunc<true, true>(args...);
else if (b1 && !b2)
templateFunc<true, false>(args...);
else if (!b1 && b2)
templateFunc<false, true>(args...);
else
templateFunc<false, false>(args...);
问题很明显,我需要对 5 个变量进行 64 次调用。有什么解决方案吗?
与std::variant
(C++17), you might do the dynamic dispatch via std::visit
:
// helper
std::variant<std::false_type, std::true_type> to_boolean_type(bool b)
{
if (b) return std::true_type{};
return std::false_type{};
}
然后
std::visit([&](auto... bs){templateFunc<bs...>(args...);},
to_boolean_type(b1), to_boolean_type(b2));
我需要 运行 一个带有 N 个布尔变量的函数,我想让它们成为 constexpr 以消除比较并保存分支预测失败的代码。
我的意思是:
templateFunc<b1, b2, b3, b4 ...>(args...);
因为 b1..bn 变量只是布尔变量并且可能只有 2 个状态,所以我可以这样写:
if (b1 && b2)
templateFunc<true, true>(args...);
else if (b1 && !b2)
templateFunc<true, false>(args...);
else if (!b1 && b2)
templateFunc<false, true>(args...);
else
templateFunc<false, false>(args...);
问题很明显,我需要对 5 个变量进行 64 次调用。有什么解决方案吗?
与std::variant
(C++17), you might do the dynamic dispatch via std::visit
:
// helper
std::variant<std::false_type, std::true_type> to_boolean_type(bool b)
{
if (b) return std::true_type{};
return std::false_type{};
}
然后
std::visit([&](auto... bs){templateFunc<bs...>(args...);},
to_boolean_type(b1), to_boolean_type(b2));