2014-11-05 100 views
7

我想上的作用域-枚举与该无符号整型切换:接通作用域枚举

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.

现在,每个交换机上使用static_cast,如:

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

修复语法错误,虽然在每种情况下,声明没有按铸造看起来这不是一个好办法。我是否真的需要在每种情况下施放,还是有更好的方法?

+0

在我看来强类型枚举的整点是,他们是......嗯,强类型,所以没有隐式转换。所以是的,你需要投。 编辑:我现在看到你不是问你是否需要施放,而是你是否需要施放每个案例。对不起这是我的错。 – antred 2014-11-05 22:24:50

回答

10

您可以通过开关变量本身铸造EnumType解决这个问题:

switch (static_cast<EnumType>(num)) { 

Demo

范围的枚举的目的是让他们强类型。为此,不存在对基础类型的隐式转换。您必须转换开关变量或开关箱。我建议转换开关变量,因为这需要更少的代码,因此将使维护更容易。

IMO的正确解决方案将改为接受const EnumType &(或只是EnumType)的功能。