Delen via


Instructies: Enums definiëren en gebruiken in C++/CLI

Opsommingstypen in C++/CLI hebben enkele verschillen met opsommingstypen in standaard C++. In dit artikel wordt uitgelegd hoe u C++/CLI-opsommingstypen gebruikt en hoe u kunt samenwerken met standaard opsommingstypen.

Het specificeren van het onderliggende type van een enum

Het onderliggende type van een opsomming is standaard int. U kunt echter het type opgeven als getekende of ongetekende formulieren van int, short, long, __int32, of __int64. U kunt ook char gebruiken.

// 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);
}

Uitvoer

sun
0
1
2

Omzetten tussen beheerde en standaardenumeraties

Er is geen standaardconversie tussen een enum en een integraal type; een cast is vereist.

// 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");
}

Uitvoer

a and day2 are the same

Operators en enumeratietypen

De volgende operators zijn geldig voor enums in C++/CLI:

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

Operators |, ^, &, , ~en ++-- worden alleen gedefinieerd voor opsommingen met integrale onderliggende typen, niet inbegrepen bool. Beide operanden moeten van het opsommingstype zijn.

De compiler voert geen statische of dynamische controle uit van het resultaat van een enum-bewerking; een bewerking kan resulteren in een waarde die niet binnen het bereik van de geldige opsommingswaarden van de enum valt.

Opmerking

C++11 introduceert enum class typen in niet-beheerde code, die aanzienlijk verschillen van beheerde enum class typen in C++/CLI. Het type C++11 enum class biedt met name geen ondersteuning voor dezelfde operators als het beheerde type in C++/CLI en C++/CLI-broncode moet een toegankelijkheidsaanduiding opgeven in beheerde enum class declaraties om deze te onderscheiden van niet-beheerde enum class declaraties (C++11enum class). Zie voor meer informatie over enum class het gebruik in C++/CLI, C++/CX en C++11 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
      ;
}

Bereikkwalificaties gebruiken om onderscheid te maken tussen enum en enum class waarden:

// 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);
}

Uitvoer

4
1
True

Zie ook

enum class