厳密な型指定の列挙型(C++11)
C++11 対応機能:インデックス への移動
BCC32 にはスコープのある列挙型が導入されています。 さらに、既存の列挙型はベースの型と明示的なスコープの点で拡張されています。 この機能は BCC32 に追加された C++11 機能の 1 つです。
スコープのある列挙型の一般的な特徴は次のとおりです。
- 列挙子はその列挙型のスコープ内にあります。
- 列挙子と列挙型は暗黙的に int に変換しません("通常の" 列挙子と列挙型は int に変換)。
- 列挙型と列挙子には定義されたベースの型があります。
宣言
enum class や enum struct を指定してスコープのある列挙型を宣言します。 例:
enum class A {A1, A2, A3 = 50, A4 /* = 51 */};
暗黙ではない型変換
スコープのある列挙型の場合は、整数から、または整数に暗黙的に変換されなくなりました。
ベース型
スコープのある列挙型では、ベースの型は正しく指定(デフォルトは int)されます。 列挙のベース型とすべての列挙子を指定するには、列挙名(wchar_t 以外の統合型を指定可能)の後に ": 型" を記述します。 次の例では、ベースの型が unsigned long である列挙型を宣言します。
enum class A : unsigned long {A1 = 1, A2 = 2, Abig = 0xFFFFFFFOU };
スコープ
スコープのある列挙型で自身のスコープを導入します。 列挙子の名前は列挙型のスコープ内にあり、囲まれたスコープに挿入されません。 次に例を示します:
enum class A { A1, A2, A3 = 100, A4 /* = 101 */ }; A a1 = A1; // error A a2 = A::A2; // OK-scope specified
既存の列挙型の変更
さらに、既存の列挙型が次のとおり拡張されます。
- 宣言に : 型を追加することによってスコープのある列挙型と同様に、任意の列挙型のベース型を指定できます。
- 既存の列挙型に、スコープのある列挙型と同様に独自のスコープが導入されました。 列挙子の名前は列挙型のスコープ内で定義され、囲まれたスコープにも挿入されません。
次に例を示します:
enum B { B1, B2, B3 = 100, B4 /* = 101 */ }; B b1 = B1; // ok B b2 = B::B2; // ok
例
次の例では 2 つのことについて示します。
- スコープのある列挙子を呼び出すメソッド
- enum class(と enum struct)は精密な型指定子で指定できません。
enum class E { a, b }; enum E x1 = E::a; // OK enum class E x2 = E::a; // illegal