C++如何编写模板实现无需指定枚举类型即可直接传入枚举值作为模板参数
C++ 单模板参数实现枚举值判断方案
核心实现(C++17及以上标准)
C++17 引入了auto作为非类型模板参数的占位符,可以自动推导传入的模板参数类型,完全符合需求,写法如下:
template<auto Last> bool is_not_last(decltype(Last) value) { return value < Last; }
调用时直接传入上限枚举值作为唯一的模板参数即可:
// 调用方式完全符合预期 is_not_last<MyEnum::_LAST>(MyEnum::OTHER_VALUE);
C11/C14 兼容方案
如果使用的编译器不支持C++17,可以通过宏包装原有模板实现类似效果,不需要修改原有模板逻辑:
// 原有模板保持不变 template<typename T, T Last> bool is_not_last(T value) { return value < Last; } // 新增宏简化调用 #define IS_NOT_LAST(upper_bound, input) is_not_last<decltype(upper_bound), upper_bound>(input)
调用方式为:
IS_NOT_LAST(MyEnum::_LAST, MyEnum::OTHER_VALUE);
错误写法原因说明
之前尝试的两种写法不符合C++模板语法规范:
template<T _L>:类型T未提前声明,编译器无法识别T的含义template<typename T _L>:模板参数列表中每个参数都需要单独声明类型,不能将类型占位符和非类型参数合并写
注意:下划线开头加大写字母的标识符(如
_LAST、_L)属于C++标准保留标识符,建议在业务代码中避免使用,避免和标准库实现冲突导致未定义行为。
内容的提问来源于stack exchange,提问作者Po1nt
相关产品推荐
相关产品推荐

