Udostępnij za pośrednictwem


Porady: definiowanie wyliczeń w języku C++/interfejsie wiersza polecenia i korzystanie z nich

Typy wyliczenia w języku C++/CLI mają pewne różnice w typach wyliczenia w standardzie C++. W tym artykule wyjaśniono, jak używać typów wyliczania C++/CLI oraz jak współpracować ze standardowymi typami wyliczania.

Określanie bazowego typu elementu enum

Domyślnie podstawowym typem wyliczenia jest int. Można jednak określić typ, który ma być podpisany lub niepodpisany formularzy int, short, long, __int32lub __int64. Możesz również użyć polecenia 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);
}

Wyjście

sun
0
1
2

Jak konwertować między wyliczeniami zarządzanymi i standardowymi

Nie ma standardowej konwersji między wyliczeniem a typem całkowitym; wymagana jest obsada.

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

Wyjście

a and day2 are the same

Operatory i wyliczenia

Następujące operatory są prawidłowe wyliczenia w języku C++/cli:

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

Operatory |, , ^, &~, ++i -- są definiowane tylko dla wyliczeń z całkowitymi typami bazowymi, a nie w tym bool. Oba operandy muszą być typu wyliczenia.

Kompilator nie sprawdza statycznego ani dynamicznego wyniku operacji wyliczenia; operacja może spowodować, że wartość nie znajduje się w zakresie prawidłowych wyliczenia.

Uwaga

Język C++11 wprowadza enum class typy w kodzie niezarządzanych, które różnią się znacznie od typów zarządzanych enum class w języku C++/CLI. W szczególności typ C++11 enum class nie obsługuje tych samych operatorów co typ zarządzany enum class w języku C++/CLI, a kod źródłowy C++/CLI musi zapewnić specyfikator ułatwień dostępu w deklaracjach zarządzanychenum class, aby odróżnić je od deklaracji niezarządzanych (C++11). enum class Aby uzyskać więcej informacji na temat enum class używania w językach C++/CLI, C++/CX i C++11, zobacz 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
      ;
}

Użyj kwalifikatorów zakresu, aby odróżnić enum wartości i 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);
}

Wynik

4
1
True

Zobacz też

enum class