Compartir a través de


Cómo: Definir y consumir enumeraciones en C++/CLI

Los tipos de enumeración en C++/CLI tienen algunas diferencias con los tipos de enumeración en C++estándar. En este artículo se explica cómo usar tipos de enumeración de C++/CLI y cómo interoperar con tipos de enumeración estándar.

Especificar el tipo subyacente de un enum

De forma predeterminada, el tipo subyacente de una enumeración es int. Sin embargo, puede especificar el tipo que se va a firmar o anular la firma de int, , shortlong, __int32o __int64. También se puede usar 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);
}

Salida

sun
0
1
2

Conversión entre enumeraciones administradas y estándar

No hay ninguna conversión estándar entre una enumeración y un tipo entero; se requiere una conversión.

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

Salida

a and day2 are the same

Operadores y enumeraciones

Los operadores siguientes son válidos en enumeraciones en C++/CLI:

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

Los operadores |, ^, &, ~, ++y -- solo se definen para las enumeraciones con tipos subyacentes enteros, sin incluir bool. Ambos operandos deben ser del tipo de enumeración.

El compilador no realiza ninguna comprobación estática o dinámica del resultado de una operación de enumeración; Una operación puede dar lugar a un valor que no esté en el intervalo de los enumeradores válidos de la enumeración.

Nota:

C++11 presenta tipos en código no administrado, que son significativamente diferentes de los tipos administrados enum classenum class en C++/CLI. En concreto, el tipo C++11 enum class no admite los mismos operadores que el tipo administrado enum class en C++/CLI y el código fuente de C++/CLI debe proporcionar un especificador de accesibilidad en declaraciones administradas enum class para distinguirlos de declaraciones no administradas (C++11). enum class Para obtener más información sobre el enum class uso en C++/CLI, C++/CX y C++11, vea 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
      ;
}

Use calificadores de ámbito para distinguir entre enum los valores y enum class :

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

Salida

4
1
True

Consulte también

enum class