打开作用域枚举

10

我正在尝试使用类型为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:
        ....
    }
}

这会导致语法错误:Error: This constant expression has type "EnumType" instead of the required "unsigned int" type.

现在,可以对每个switch使用static_cast,例如:

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

修复了语法错误,尽管在每个case语句中进行强制转换似乎不是一个好的解决方法。我是否真的需要在每个case中进行强制转换,还是有更好的方法?


在我看来,强类型枚举的整个重点在于它们是强类型的,因此没有隐式转换。所以是的,你需要进行强制转换。编辑:我现在明白了,你不是在问是否需要进行强制转换,而是是否需要为每种情况进行强制转换。抱歉,我的错。 - antred
1个回答

13
你可以通过将开关变量本身转换为EnumType来解决此问题:
switch (static_cast<EnumType>(num)) {

(演示)

作用域枚举的目的是使它们具有强类型。为此,没有对基础类型进行隐式转换。必须将switch变量或switch case进行转换。我建议转换switch变量,因为这需要更少的代码,因此会使维护更容易。

在我看来,正确的解决方案是将函数更改为接受const EnumType &(或只是EnumType)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接