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