C++ 范围仅限于“但”;“半弱”;类型化枚举

C++ 范围仅限于“但”;“半弱”;类型化枚举,c++,c++11,enums,C++,C++11,Enums,我希望以作用域格式使用枚举,但能够在枚举和无符号整数之间进行比较和赋值 这是我尝试过的代码,如下所示,效果与预期一致: class SystemEvents { public: enum { Opened, Closed }; }; class OtherEvents { public: enum { Closed,Opened }; }; //test uint32_t e = SystemEvents::Opened; if(e == O

我希望以作用域格式使用枚举,但能够在枚举和无符号整数之间进行比较和赋值

这是我尝试过的代码,如下所示,效果与预期一致:

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"; 
class系统事件{
公众:
枚举{
打开,关闭
};
};
分类其他事件{
公众:
枚举{
关闭,打开
};
};
//试验
uint32_t e=SystemEvents::Opened;

如果(e==OtherEvents::Closed)std::cout可以显式地将枚举类强制转换为整数类型,例如:

static_cast<uint32_t>(SystemEvents::Opened)
static_cast(SystemEvents::Opened)
您还可以编写将强制转换为任何枚举类的基础类型的代码


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

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

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

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

和其他操作符,如
=

为什么要使用两个不同的枚举来表示同一件事?我开始考虑我要做的事情,也许使用弱类型枚举就足够了。我主要是尝试将uint32\t与SystemEvents进行比较。我把另一个作为测试范围。
bool operator==( uint32_t lhs, SystemEvents rhs )
{
    return static_cast< SystemEvent >( lhs ) == rhs;
}
bool operator==( SystemEvents lhs, uint32_t rhs );