Compartir vía


Procedimiento Definir y usar enumeraciones en C++/CLI

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

Modificar el tipo subyacente de un valor 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 las formas sin signo de int, short, long, __int32 o __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

Cómo convertir enumeraciones administradas en estándares y viceversa

No hay ninguna conversión estándar entre una enumeración y un tipo entero; se requiere una coerció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 enumeraciones con tipos subyacentes enteros, sin incluir bool. Ambos operandos deben ser del tipo de la enumeración.

El compilador no lleva a cabo ninguna comprobación estática ni 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 enum class en código no administrado, que son considerablemente diferentes a los tipos enum class administrados en C++/CLI. En concreto, el tipo enum class de C++11 no admite los mismos operadores que el tipo enum class administrado en C++/CLI. Además, el código fuente de C++/CLI debe proporcionar un especificador de accesibilidad en declaraciones enum class administradas para distinguirlas de declaraciones enum class no administradas (C++11). Para obtener más información sobre el uso de enum class 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 valores enum de 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