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。