Klasy enum („nowe teksty stałe”, „silne wyliczenia”) dotyczą trzech problemów z tradycyjnym C++ wyliczenia:
- konwencjonalny
enums
niejawnie przekonwertować do int
, co powoduje błędy, gdy ktoś nie chce wyliczanie do działania jako liczba całkowita.
- konwencjonalne
enums
wyeksportuj ich moduły wyliczające do otaczającego zakresu, powodując konflikty nazw.
- Nie można określić podstawowego rodzaju obiektu
enum
, powodując zamieszanie, problemy ze zgodnością i uniemożliwiając przesłanie zgłoszenia do przodu.
enum class
(„mocne teksty stałe”) są silnie wpisane i scoped:
enum Alert { green, yellow, orange, red }; // traditional enum
enum class Color { red, blue }; // scoped and strongly typed enum
// no export of enumerator names into enclosing scope
// no implicit conversion to int
enum class TrafficLight { red, yellow, green };
Alert a = 7; // error (as ever in C++)
Color c = 7; // error: no int->Color conversion
int a2 = red; // ok: Alert->int conversion
int a3 = Alert::red; // error in C++98; ok in C++11
int a4 = blue; // error: blue not in scope
int a5 = Color::blue; // error: not Color->int conversion
Color a6 = Color::blue; // ok
Jak widać, tradycyjne teksty stałe pracować jak zwykle, ale można teraz opcjonalnie zakwalifikować z nazwą użytkownika ENUM.
Nowe wyrazy są "klasą enum", ponieważ łączą aspekty tradycyjnych wyliczeń (wartości nazw) z aspektami zajęć (członkowie o ograniczonym zasięgu i brak konwersji).
Będąc w stanie określić typ podstawowy umożliwić prostszą interoperacyjność i gwarantowane wielkości wyliczeń:
enum class Color : char { red, blue }; // compact representation
enum class TrafficLight { red, yellow, green }; // by default, the underlying type is int
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U }; // how big is an E?
// (whatever the old rules say;
// i.e. "implementation defined")
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U }; // now we can be specific
Umożliwia również naprzód deklaracja teksty stałe:
enum class Color_code : char; // (forward) declaration
void foobar(Color_code* p); // use of forward declaration
// ...
enum class Color_code : char { red, yellow, green, blue }; // definition
typ bazowy musi być jednym z podpisane lub bez znaku liczby całkowite; wartość domyślna to int
.
w bibliotece standardowej, enum
zajęcia są wykorzystywane do:
- systemy odwzorowania poszczególnych kodów błędów: W
<system_error>
: enum class errc
; wskaźniki bezpieczeństwa
- palików: W
<memory>
: enum class pointer_safety { relaxed, preferred, strict };
- błędy We/Wy stream: W
<iosfwd>
: enum class io_errc { stream = 1 };
- komunikacji asynchronicznej obsługi błędów: W
<future>
: enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Kilka z nich operatorów, takich jak ==
zdefiniowane.
Czy obejrzałeś [wikipedia] (http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations)? – Nobody
@Nobody: Tak, patrzyłem na 'wiki', ale nie byłem w stanie zrozumieć, jak go używać i jakie są korzyści. –