如何基于enum class值在constexpr分支中执行对应代码逻辑
问题根源
你当前的写法中,给f()传的是E枚举类型的普通值,模板参数T会被统一推导为E类型,和你定义的val1_t/val2_t(都是std::integral_constant的特化类型)永远不相等,所以if constexpr的判断永远不成立,两次调用都走else分支输出val2。
解决方法
核心是把枚举值的信息带到编译期,让模板能识别不同枚举值对应的类型,常用的有两种改法:
改法1:直接传入对应类型的实例
不需要修改原f()的定义,只调整main中的传参内容,传入你提前定义好的val1_t、val2_t实例即可:
int main() { f(val1_t{}); // T推导为val1_t,匹配if分支输出val1 f(val2_t{}); // T推导为val2_t,走else分支输出val2 }
改法2:将枚举值作为非类型模板参数传入(写法更直观)
如果不想单独维护integral_constant的别名,可以直接调整f()的定义,把枚举值放到模板参数里,C++17及以上版本可以直接这么写:
enum class E { val1, val2 }; template <E e> // 枚举值作为非类型模板参数,编译期可见 void f() { if constexpr (e == E::val1) { std::cerr << "val1\n"; } else { std::cerr << "val2\n"; } } int main() { f<E::val1>(); // 输出val1 f<E::val2>(); // 输出val2 }
补充说明
如果你必须接收运行时生成的E类型变量,那没法直接用if constexpr做分支选择,因为运行时值在编译期不可知,只能换用普通if判断,或者预先把所有枚举值的分支实例化,再通过运行时查表调用对应的实例。
内容的提问来源于stack exchange,提问作者psb
相关产品推荐
相关产品推荐

