列挙型クラス(「新しい列挙型」、「強力な列挙型」)は、従来のC ++列挙型の3つの問題に対処します。
- 従来は
enums
暗黙的にに変換されint
、誰かが列挙型を整数として機能させたくない場合にエラーを引き起こします。
- 従来は
enums
、列挙子を周囲のスコープにエクスポートし、名前の衝突を引き起こしていました。
- の基になる型を
enum
指定できないため、混乱や互換性の問題が発生し、前方宣言が不可能になります。
enum class
(「強い列挙型」)は強く型付けされ、スコープが設定されています。
enum Alert { green, yellow, orange, red };
enum class Color { red, blue };
enum class TrafficLight { red, yellow, green };
Alert a = 7;
Color c = 7;
int a2 = red;
int a3 = Alert::red;
int a4 = blue;
int a5 = Color::blue;
Color a6 = Color::blue;
示されているように、従来の列挙型は通常どおり機能しますが、オプションで列挙型の名前で修飾できるようになりました。
新しい列挙型は、従来の列挙型の側面(名前の値)とクラスの側面(スコープメンバーと変換の欠如)を組み合わせているため、「列挙型クラス」です。
基になる型を指定できるため、相互運用性が向上し、列挙型のサイズが保証されます。
enum class Color : char { red, blue };
enum class TrafficLight { red, yellow, green };
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U };
また、列挙型の前方宣言も可能です。
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
基になる型は、符号付きまたは符号なし整数型のいずれかである必要があります。デフォルトはint
です。
標準ライブラリでは、enum
クラスは次の目的で使用されます。
- マッピングシステム固有のエラーコード:In
<system_error>
:enum class errc
;
- ポインター安全インジケーター:で
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- I / Oストリームエラー:で
<iosfwd>
:enum class io_errc { stream = 1 };
- 非同期通信エラー処理:で
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
これらのいくつかには、==
定義済みなどの演算子があります。
enum class Colours
とenum class Fruits
。VS2010でコードを書いたとき。。の"expects a defination or a tag name"
下にエラーがスローされclass
ます。