You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:11:03