Enumérations fortement typées (C++11)
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.
Sommaire
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