如何在C++中用using指令或类似方式访问enum class的所有枚举值?
解决强类型枚举函数内访问冗余的方法
针对你用enum class TokenKind时,在validSyntax方法里每次写TokenKind::太繁琐的问题,有几个实用的解决办法,适配不同的C++版本:
1. C++20及以上:用using enum直接导入所有枚举值
这是最省事的方案,C++20专门加了这个语法来解决强类型枚举的作用域问题,直接把枚举类的所有值导入当前函数作用域:
void validSyntax() { using enum TokenKind; // 现在可以直接写枚举值,不用加作用域 if (currentToken == Number || currentToken == Plus) { // 你的语法检查逻辑 } }
写一次using enum,整个函数里都能直接用枚举值,代码清爽不少。
2. 兼容C++11及以上:给常用枚举值单独起别名
如果项目还在用C++17或更早版本,或者不想一次性导入所有枚举值(怕命名冲突),可以给要用到的枚举值单独定义别名:
void validSyntax() { const auto Number = TokenKind::Number; const auto Plus = TokenKind::Plus; const auto Minus = TokenKind::Minus; // 用到哪个就定义哪个 if (currentToken == Number || currentToken == Plus) { // 逻辑代码 } }
这种方式更灵活,而且const auto是编译期常量,完全不会有性能影响。
3. 给枚举类起短别名(全版本兼容)
如果只是觉得TokenKind这个名字太长,也可以先给整个枚举类起个短别名,然后用别名加作用域访问:
void validSyntax() { using TK = TokenKind; // 把TokenKind缩成TK if (currentToken == TK::Number || currentToken == TK::Plus) { // 逻辑代码 } }
虽然还是要写作用域,但名字变短了,代码可读性也会提升,而且所有支持enum class的C版本(C11及以上)都能用。
小提醒
- 用
using enum的时候要注意当前函数里有没有和枚举值同名的变量或函数,避免命名冲突; - 要是团队有代码规范,最好先确认下是否允许用这些简化写法,避免风格不一致。
内容的提问来源于stack exchange,提问作者a_floating_point
相关产品推荐
相关产品推荐

