范围但“半弱”类型的枚举

时间:2014-01-18 14:27:33

标签: c++ c++11 enums

我想使用范围格式的枚举,但能够在枚举和无符号整数之间进行比较和赋值。

这就是我尝试下面的代码,它按预期工作:

class SystemEvents {
public:
    enum {
        Opened, Closed
    };
};

class OtherEvents {
public:
  enum {
     Closed,Opened
  };
};

//test
uint32_t e = SystemEvents::Opened;
if(e == OtherEvents::Closed) std::cout << "enums are weakly typed and scoped"; 

但是我想知道是否有办法用C ++ 11语法来实现它?

enum class SystemEvents : uint32_t {
   Opened,Closed
};

enum class OtherEvents : uint32_t {
   Closed,Opened
};

//test
uint32_t e = SystemEvents::Opened;
if(e == OtherEvents::Closed) std::cout << "enums are weakly typed and scoped"; 

上面的代码给出了我预期的错误Cannot initialize a variable of type int with an rvalue of type SystemEvents。那么,我应该坚持使用C风格范围的枚举,还是有办法在C ++ 11中实现它?还是有其他方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:3)

对于初始化,除了强制转换值之外,没有什么可以做的。请注意,C ++ 11的强类型枚举并不是要替换现有的枚举,而是补充现有的枚举。如果您想要弱类型的枚举,请不要使用enum class

对于强类型枚举的比较,您可以声明必要的运算符并在实现中强制转换:

bool operator==( uint32_t lhs, SystemEvents rhs )
{
    return static_cast< SystemEvent >( lhs ) == rhs;
}

当然你需要两个方向:

bool operator==( SystemEvents lhs, uint32_t rhs );

!=等其他运营商一样。

答案 1 :(得分:1)

您可以将枚举类显式地转换为整数类型,例如:

static_cast<uint32_t>(SystemEvents::Opened)

您还可以编写将a function转换为任何枚举类的基础类型。

然而,需要这样做表明你做错了什么。您为什么要将SystemEventsOtherEvents进行比较?