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

提供: RAD Studio
移動先: 案内検索

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

BCC32 にはスコープのある列挙型が導入されています。 さらに、既存の列挙型はベースの型と明示的なスコープの点で拡張されています。 この機能は BCC32 に追加された C++11 機能の 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;     // 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

関連項目