c++ - 打开作用域枚举

标签 c++ visual-c++ c++11 enums switch-statement

我正在尝试打开类型为 unsigned int 的作用域枚举:

枚举定义为:

const enum struct EnumType : unsigned int { SOME = 1, MORE = 6, HERE = 8 };

我收到一个 const unsigned int 引用,我正在尝试根据枚举值检查该值。

void func(const unsigned int & num)
{
    switch (num)
    {
    case EnumType::SOME:
        ....
        break;
    case EnumType::MORE:
        ....
        break;

    ....

    default:
        ....
    }
}

这会导致语法错误:错误:此常量表达式的类型为“EnumType”,而不是所需的“unsigned int”类型。

现在,在每个开关上使用一个static_cast,例如:

case static_cast<unsigned int>(EnumType::SOME):
    ....
    break;
case static_cast<unsigned int>(EnumType::MORE):
    ....
    break;

修复了语法错误,尽管在每个 case 语句中进行强制转换似乎不是执行此操作的好方法。我真的需要对每种情况进行转换,还是有更好的方法?

最佳答案

您可以通过将 switch 变量本身转换为 EnumType 来解决这个问题:

switch (static_cast<EnumType>(num)) {

( Demo )

作用域枚举的目的是使它们成为强类型的。为此,不存在与基础类型之间的隐式转换。您必须转换 switch 变量或 switch cases。我建议转换 switch 变量,因为这需要更少的代码,因此会使维护更容易。

IMO 正确的解决方案是更改函数以接受 const EnumType &(或只是 EnumType)。

关于c++ - 打开作用域枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26768252/

相关文章:

c++ - 排序算法问题 - 模板

c++ - 为什么要更改 C++ 中特定警告的警告级别?

c++ - 模板特化静态初始化 icc+vc vs gcc+clang

performance - 指数移动平均线

c++ - 从 .obj 文件在 OpenGL 中绘制四边形

C++17 和十进制浮点的当前状态

C++回调函数

C++11 - move 语义在构造上很慢

c++ - move std::vector 的 std::unique_locks

c++ - 成员函数声明中是否允许限定名称?