作用域限定但是“半弱类型”枚举

4

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

下面是我尝试过的代码,它的运行效果符合预期:

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"; 

如预期那样,上述代码给了我一个错误:“无法使用SystemEvents的rvalue类型初始化int类型的变量”。那么,我应该坚持使用C风格的作用域枚举,还是有一种C++11的方法可以解决这个问题?或者还有其他方法可以解决吗?


你为什么使用两个不同的枚举来表示相同的事情? - Sean
我开始思考我要做什么,也许对我来说使用弱类型枚举就足够了。 - Gasim
2个回答

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
你可以将枚举类显式转换为整数类型,例如:
static_cast<uint32_t>(SystemEvents::Opened)

你也可以编写一个函数,将其转换为任何枚举类的基础类型。然而,需要这样做表明你正在做一些错误的事情。为什么要比较 SystemEvents 和 OtherEvents?

我主要是在尝试将uint32_t与SystemEvents进行比较。我将另一个作为范围测试。 - Gasim

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