C++惯用法之enum class

在Effective modern C++中Item 10: Prefer scoped enums to unscoped enum,调到要用有范围的enum class代替无范围的enum。

例如:

  1. enum Shape {circle,retangle};
  2. auto circle = 10; // error

上述错误是因为两个circle在同一范围。对于enum等价于:

  1. #define circle 0
  2. #define retangle 1

因此后面再去定义circle就会出错。

所以不管枚举名是否一样,里面的成员只要有一致的,就会出问题。例如:

  1. enum A {a,b};
  2. enum B {c,a};

a出现两次,在enum B的a处报错。

根据前面我们知道,enum名在范围方面没有什么作用,因此我们想到了namespace,如下例子:

  1. // 在创建枚举时,将它们放在名称空间中,以便可以使用有意义的名称访问它们:
  2. namespace EntityType {
  3. enum Enum {
  4. Ground = 0,
  5. Human,
  6. Aerial,
  7. Total
  8. };
  9. }
  10. void foo(EntityType::Enum entityType)
  11. {
  12. if (entityType == EntityType::Ground) {
  13. /*code*/
  14. }
  15. }

将命名空间起的有意思点,就可以达到想要的效果。

但是不断的使用命名空间,势必太繁琐,而且如果我不想使用namespace,要达到这样的效果,便会变得不安全,也没有约束。

因此在c++11后,引入enum class。

enum class 解决了为enum成员定义类型、类型安全、约束等问题。回到上述例子:

  1. // enum class
  2. enum class EntityType {
  3. Ground = 0,
  4. Human,
  5. Aerial,
  6. Total
  7. };
  8. void foo(EntityType entityType)
  9. {
  10. if (entityType == EntityType::Ground) {
  11. /*code*/
  12. }
  13. }

这便是这一节要阐述的惯用法:enum class。