­

C++慣用法之enum class

  • 2019 年 12 月 16 日
  • 筆記

C++慣用法之enum class

在Effective modern C++中Item 10: Prefer scoped enums to unscoped enum,調到要用有範圍的enum class代替無範圍的enum。

例如:

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

上述錯誤是因為兩個circle在同一範圍。對於enum等價於:

#define circle 0  #define retangle 1  

因此後面再去定義circle就會出錯。

所以不管枚舉名是否一樣,裡面的成員只要有一致的,就會出問題。例如:

enum A {a,b};  enum B {c,a};  

a出現兩次,在enum B的a處報錯。

根據前面我們知道,enum名在範圍方面沒有什麼作用,因此我們想到了namespace,如下例子:

// 在創建枚舉時,將它們放在名稱空間中,以便可以使用有意義的名稱訪問它們:  namespace EntityType {      enum Enum {          Ground = 0,          Human,          Aerial,          Total      };  }    void foo(EntityType::Enum entityType)  {      if (entityType == EntityType::Ground) {          /*code*/      }  }  

將命名空間起的有意思點,就可以達到想要的效果。

但是不斷的使用命名空間,勢必太繁瑣,而且如果我不想使用namespace,要達到這樣的效果,便會變得不安全,也沒有約束。

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

enum class 解決了為enum成員定義類型、類型安全、約束等問題。回到上述例子:

// enum class  enum class EntityType {      Ground = 0,      Human,      Aerial,      Total  };    void foo(EntityType entityType)  {      if (entityType == EntityType::Ground) {          /*code*/      }  }  

這便是這一節要闡述的慣用法:enum class。