Enumérations fortement typées (C++11)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Fonctionnalités C++11 - Index

C++Builder 2009 introduit les énumérations de portée. En outre, les énumérations existantes sont étendues avec le type sous-jacent et la portée explicite. Cette fonctionnalité fait partie des fonctionnalités C++0x ajoutées à C++Builder 2009.

Les énumérations de portée sont généralement caractérisées comme suit :

  • Les énumérateurs sont dans la portée de leur énumération.
  • Les énumérateurs et les énumérations ne sont pas implicitement convertis en int (comme le font les énumérations et énumérateurs "ordinaires").
  • Les énumérations et les énumérateurs peuvent avoir un type sous-jacent défini.

Déclaration

Vous déclarez une énumération de portée en spécifiant enum class ou enum struct. Par exemple :

enum class A { A1, A2, A3 = 50, A4 /* = 51 */ };

Pas de conversion de type implicite

Avec les énumérations de portée, il n'y a plus de conversion implicite vers ou depuis un integer.

Type sous-jacent

Pour les énumérations de portée, le type sous-jacent est bien spécifié (la valeur par défaut est int). Vous pouvez spécifier le type sous-jacent de l'énumération et de tous les énumérateurs en écrivant : le type après le nom de l'énumération (vous pouvez spécifier tout type intégral à l'exception de wchar_t). L'exemple suivant déclare une énumération de type sous-jacent unsigned long :

enum class A : unsigned long {A1 = 1, A2 = 2, Abig = 0xFFFFFFFOU };

Portée

Une énumération de portée introduit sa propre portée. Les noms des énumérateurs sont dans la portée de l'énumération, et ne sont pas injectés dans la portée englobante. Par exemple :

enum class A { A1, A2, A3 = 100, A4 /* = 101 */ };
A a1 = A1; 	// erreur
A a2 = A::A2; 	// OK-portée spécifiée

Changements apportés aux énumérations existantes

De plus, les énumérations existantes sont étendues comme suit :

  • Vous pouvez maintenant spécifier le type sous-jacent de n'importe quelle énumération, simplement comme avec les énumérations de portée (en ajoutant : type à la déclaration).
  • Les énumérations existantes introduisent maintenant leur propre portée, simplement comme avec les énumérations de portée. Les noms des énumérateurs sont définis dans la portée de l'énumération et sont également injectés dans la portée englobante.

Par exemple :

enum B { B1, B2, B3 = 100, B4 /* = 101 */ };
B b1 = B1; 	// ok
B b2 = B::B2; 	// ok

Exemples

Les exemples suivants illustrent les deux points suivants :

  • La méthode d'appel des énumérateurs de portée
  • Le fait que enum class (et enum struct) ne peuvent pas être spécifiés avec les spécificateurs de type élaboré
enum class E { a, b };
enum E x1 = E::a; // OK
enum class E x2 = E::a; // illégal

Voir aussi