Freigeben über


Vorgehensweise: Definieren und Verarbeiten von Enumerationen in C++/CLI

Enumerationstypen in C++/CLI weisen einige Unterschiede zu Enumerationstypen in Standard-C++ auf. In diesem Artikel wird erläutert, wie Sie C++-/CLI-Enumerationstypen für die Arbeit mit Standardenumerationstypen verwenden.

Angeben des zugrunde liegenden Typs eines enum

Der einer Enumeration zugrunde liegende Typ ist standardmäßig int. Sie können jedoch auch die Typen int, short, long, __int32 oder __int64 mit und ohne Vorzeichen angeben. Sie können auch char verwenden.

// mcppv2_enum_3.cpp
// compile with: /clr
public enum class day_char : char {sun, mon, tue, wed, thu, fri, sat};

int main() {
   // fully qualified names, enumerator not injected into scope
   day_char d = day_char::sun, e = day_char::mon;
   System::Console::WriteLine(d);
   char f = (char)d;
   System::Console::WriteLine(f);
   f = (char)e;
   System::Console::WriteLine(f);
   e = day_char::tue;
   f = (char)e;
   System::Console::WriteLine(f);
}

Output

sun
0
1
2

Konvertieren zwischen verwalteten und Standardenumerationen

Es gibt keine Standardkonvertierung zwischen einer Enumeration und einem integralen Typ, sondern es ist eine Umwandlung erforderlich.

// mcppv2_enum_4.cpp
// compile with: /clr
enum class day {sun, mon, tue, wed, thu, fri, sat};
enum {sun, mon, tue, wed, thu, fri, sat} day2; // unnamed std enum

int main() {
   day a = day::sun;
   day2 = sun;
   if ((int)a == day2)
   // or...
   // if (a == (day)day2)
      System::Console::WriteLine("a and day2 are the same");
   else
      System::Console::WriteLine("a and day2 are not the same");
}

Output

a and day2 are the same

Operatoren und Enumerationen

Die folgenden Operatoren sind für Enumerationen in C++/CLI gültig:

Operator
== != < > <= >=
+ -
| ^ & ~
++ --
sizeof

Die Operatoren |, ^, &, ~, ++ und -- werden nur für Enumerationen mit integralen zugrunde liegenden Typen definiert, was bool ausschließt. Beide Operanden müssen den Enumerationstyp aufweisen.

Der Compiler führt keine statische oder dynamische Überprüfung des Ergebnisses eines Enumerationsvorgangs durch. Ein Vorgang kann als Ergebnis einen Wert haben, der nicht im Bereich der gültigen Enumeratoren der Enumeration liegt.

Hinweis

In C++11 wurden enum class-Typen in nicht verwaltetem Code eingeführt, die sich erheblich von verwalteten enum class-Typen in C++/CLI unterscheiden. Insbesondere unterstützt der C++11-Typ enum class nicht dieselben Operatoren wie der verwaltete enum class-Typ in C++/CLI, und C++-/CLI-Quellcode muss einen Zugriffsspezifizierer in verwalteten enum class-Deklarationen bereitstellen, um sie von nicht verwalteten (C++11) enum class-Deklarationen zu unterscheiden. Weitere Informationen zur Verwendung von enum class in C++/CLI, C++/CX und C++11 finden Sie unter enum class.

// mcppv2_enum_5.cpp
// compile with: /clr
private enum class E { a, b } e, mask;
int main() {
   if ( e & mask )   // C2451 no E->bool conversion
      ;

   if ( ( e & mask ) != 0 )   // C3063 no operator!= (E, int)
      ;

   if ( ( e & mask ) != E() )   // OK
      ;
}

Verwenden Sie Bereichsqualifizierer, um zwischen enum- und enum class-Werten zu unterscheiden:

// mcppv2_enum_6.cpp
// compile with: /clr
private enum class day : int {sun, mon};
enum : bool {sun = true, mon = false} day2;

int main() {
   day a = day::sun, b = day::mon;
   day2 = sun;

   System::Console::WriteLine(sizeof(a));
   System::Console::WriteLine(sizeof(day2));
   a++;
   System::Console::WriteLine(a == b);
}

Output

4
1
True

Siehe auch

enum class