在 constexpr 分支中使用枚举 class 值
Using enum class values in constexpr branches
下面的代码在两个 f()
调用中打印 val2
。根据枚举值在 f()
中执行特定分支的正确方法是什么?
enum class E
{
val1,
val2
};
using val1_t = std::integral_constant<E, E::val1>;
using val2_t = std::integral_constant<E, E::val2>;
template <typename T>
void f(T t)
{
if constexpr (std::is_same_v<T, val1_t>)
{
std::cerr << "val1\n";
}
else
{
std::cerr << "val2\n";
}
}
int main()
{
f(E::val1);
f(E::val2);
}
如果将枚举移动到模板参数中,则可以使用
template <E val>
void f()
{
if constexpr (val == E::val1)
{
std::cerr << "val1\n";
}
else
{
std::cerr << "val2\n";
}
}
你会像这样使用它
int main()
{
f<E::val1>();
f<E::val2>();
}
下面的代码在两个 f()
调用中打印 val2
。根据枚举值在 f()
中执行特定分支的正确方法是什么?
enum class E
{
val1,
val2
};
using val1_t = std::integral_constant<E, E::val1>;
using val2_t = std::integral_constant<E, E::val2>;
template <typename T>
void f(T t)
{
if constexpr (std::is_same_v<T, val1_t>)
{
std::cerr << "val1\n";
}
else
{
std::cerr << "val2\n";
}
}
int main()
{
f(E::val1);
f(E::val2);
}
如果将枚举移动到模板参数中,则可以使用
template <E val>
void f()
{
if constexpr (val == E::val1)
{
std::cerr << "val1\n";
}
else
{
std::cerr << "val2\n";
}
}
你会像这样使用它
int main()
{
f<E::val1>();
f<E::val2>();
}