Streng typisierte Aufzählungen (C++0x)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu C++0x-Features - Index

Appmethod C++ 2009 führt bereichsabhängige Aufzählungen ein. Darüberhinaus wurden vorhandene Aufzählungen mit zugrunde liegenden Typen und expliziter Gültigkeitsbereichszuordnung erweitert. Dieses C++0x-Feature wurde zu Appmethod C++ 2009 hinzugefügt.

Bereichsabhängige Aufzählungen werden im Allgemeinen folgendermaßen charakterisiert:

  • Enumeratoren befinden sich im Gültigkeitsbereich ihrer Aufzählung.
  • Enumeratoren und Aufzählungen werden nicht implizit in int umgewandelt (wie bei "einfachen" Enumeratoren und Aufzählungen).
  • Aufzählungen und ihre Enumeratoren können einen zugrunde liegenden Typ haben.

Deklaration

Sie deklarieren eine bereichsabhängige Aufzählung durch Festlegen der Aufzählungsklasse (enum class) oder Aufzählungsstruktur (enum struct). Zum Beispiel:

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

Keine implizite Typumwandlung

Bei bereichsabhängigen Aufzählungen gibt es keine implizite Umwandlung in oder aus Integerwerten.

Zugrunde liegender Typ

Bei bereichsabhängigen Aufzählungen ist der zugrunde liegende Typ klar spezifiziert (die Vorgabe ist int). Sie können den zugrunde liegenden Typ der Aufzählung und aller Enumeratoren folgendermaßen festlegen: Geben Sie nach dem Namen der Aufzählung den Typ an (Sie können alle integralen Typen außer wchar_t angeben). Das folgende Beispiel deklariert eine Aufzählung mit dem zugrunde liegenden Typ unsigned long:

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

Gültigkeitsbereichszuordnung

Eine bereichsabhängige Aufzählung führt ihren eigenen Gültigkeitsbereich ein. Die Namen der Enumeratoren befinden sich im Gültigkeitsbereich der Aufzählung und werden nicht in den umgebenden Gültigkeitsbereich eingebracht. Zum Beispiel:

enum class A { A1, A2, A3 = 100, A4 /* = 101 */ };
A a1 = A1; 	// Fehler
A a2 = A::A2; 	// OK, Gültigkeitsbereich festgelegt

Änderungen an vorhandenen Aufzählungen

Vorhandene Aufzählungen wurden folgendermaßen erweitert:

  • Sie können jetzt genauso wie bei bereichsabhängigen Aufzählungen den zugrunde liegenden Typ jeder Aufzählung festlegen (indem : type zu der Deklaration hinzugefügt wird).
  • Vorhandene Aufzählungen führen nun genauso wie bereichsabhängige Aufzählungen ihre eigenen Gültigkeitsbereiche ein. Die Namen der Enumeratoren werden im Gültigkeitsbereich der Aufzählung definiert und auch in den umgebenden Gültigkeitsbereich eingebracht.

Zum Beispiel:

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

Beispiele

Die folgenden Beispiele demonstrieren Folgendes:

  • Die Methode zum Aufrufen von bereichsabhängigen Enumeratoren
  • Die Tatsache, dass enum class (und enum struct) nicht mit erweiterten Typ-Bezeichnern festgelegt werden können
enum class E { a, b };
enum E x1 = E::a; // OK
enum class E x2 = E::a; // ungültig

Siehe auch