厳密な型指定の列挙型(C++0x)

提供: Appmethod Topics
移動先: 案内検索

C++0x 対応機能:インデックス への移動

Appmethod C++ 2009 にはスコープのある列挙型が導入されています。 さらに、既存の列挙型はベースの型と明示的なスコープの点で拡張されています。 この機能は Appmethod C++ 2009 に追加された C++0x 機能の 1 つです。

スコープのある列挙型の一般的な特徴は次のとおりです。

  • 列挙子はその列挙型のスコープ内にあります。
  • 列挙子と列挙型は暗黙的に int に変換しません("通常の" 列挙子と列挙型は int に変換)。
  • 列挙型と列挙子には定義されたベースの型があります。

宣言

enum classenum 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; 	// エラー
A a2 = A::A2; 	// OK-スコープ指定

既存の列挙型の変更

さらに、既存の列挙型が次のとおり拡張されます。

  • 宣言に : 型を追加することによってスコープのある列挙型と同様に、任意の列挙型のベース型を指定できます。
  • 既存の列挙型に、スコープのある列挙型と同様に独自のスコープが導入されました。 列挙子の名前は列挙型のスコープ内で定義され、囲まれたスコープにも挿入されません。

次に例を示します:

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; // 不正

関連項目