Procédure : Définir et consommer des énumérateurs dans C++/CLI
Les types d’énumération en C++/CLI présentent des différences avec les types d’énumération en C++standard. Cet article explique comment utiliser des types d’énumération C++/CLI et comment interagir avec des types d’énumération standard.
Spécification du type sous-jacent d’un enum
Par défaut, le type sous-jacent d’une énumération est int
. Toutefois, vous pouvez spécifier le type à signer ou non signé des formulaires de int
, , short
, long
, __int32
ou __int64
. Vous pouvez également utiliser char
.
// 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);
}
Sortie
sun
0
1
2
Comment convertir entre les énumérations managées et standard
Il n’existe aucune conversion standard entre une énumération et un type intégral ; un cast est requis.
// 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");
}
Sortie
a and day2 are the same
Opérateurs et énumérations
Les opérateurs suivants sont valides sur les énumérations en C++/CLI :
Opérateur |
---|
== != < > <= >= |
+ - |
| ^ & ~ |
++ -- |
sizeof |
Les opérateurs |
, , ^
, &
~
, ++
et --
sont définis uniquement pour les énumérations avec des types sous-jacents intégraux, sans inclure bool
. Les deux opérandes doivent être du type d’énumération.
Le compilateur n’effectue aucune case activée statique ou dynamique du résultat d’une opération d’énumération ; une opération peut entraîner une valeur qui ne se trouve pas dans la plage des énumérateurs valides de l’énumération.
Remarque
C++11 introduit des types dans du code non managé, qui sont considérablement différents des types managés enum class
enum class
dans C++/CLI. En particulier, le type C++11 enum class
ne prend pas en charge les mêmes opérateurs que le type managé en C++/CLI et le code source C++/CLI doit fournir un spécificateur d’accessibilité dans les déclarations managées enum class
afin de les distinguer des déclarations non managées enum class
(C++11). enum class
Pour plus d’informations sur l’utilisation enum class
dans C++/CLI, C++/CX et C++11, consultez 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
;
}
Utilisez des qualificateurs d’étendue pour faire la distinction entre enum
et enum class
les valeurs :
// 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);
}
Sortie
4
1
True
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour