Partilhar via


Como: definir e consumir enumerações no C++/CLI

Tipos de enumeração em C++/CLI têm algumas diferenças em relação a tipos de enumeração em C++ padrão. Este artigo explica como usar os tipos de enumeração em C++/CLI e como interoperar com tipos de enumeração padrão.

Especificar o tipo subjacente de um enum

Por padrão, o tipo subjacente de uma enumeração é int. No entanto, você pode especificar o tipo a como formas com sinal e sem sinal de int, short, long, __int32 ou __int64. Também é possível 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);
}

Saída

sun
0
1
2

Como converter entre enumerações gerenciadas e padrão

Já que não há conversão padrão entre uma enumeração e um tipo integral, uma conversão é necessária.

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

Saída

a and day2 are the same

Operadores e enumerações

Os seguintes operadores são válidos em enumerações em C++/CLI:

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

Os operadores |, ^, &, ~, ++ e -- são definidos apenas para enumerações com tipos integrais subjacentes, não incluindo bool. Ambos os operandos devem ser do tipo da enumeração.

Como o compilador não faz nenhuma verificação estática ou dinâmica do resultado de uma operação de enumeração, uma operação pode resultar em um valor que não está no intervalo dos enumeradores válidos da enumeração.

Observação

C++11 introduz tipos enum class em código não gerenciado, que são significativamente diferentes dos tipos enum class gerenciados na C++/CLI. Em particular, o tipo enum class C++11 não dá suporte aos mesmos operadores que o tipo enum class gerenciado na C++/CLI e o código-fonte C++/CLI deve fornecer um especificador de acessibilidade em declarações enum class gerenciadas para distingui-los das declarações enum class não gerenciadas (C++11). Para saber mais sobre o uso de enum class em C++/CLI, C++/CX e C++11, confira 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 qualificadores de escopo para distinguir entre valores enum e 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);
}

Saída

4
1
True

Confira também

enum class