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