Las clases de enumeración ("nuevas enumeraciones", "enumeraciones fuertes") frente a tres problemas con la tradicional C enumeraciones ++:
- convencional
enums
implícitamente convertir a int
, causando errores cuando alguien no quiere una enumeración para actuar como un entero.
- convencional
enums
exportan sus enumeradores al ámbito circundante, causando conflictos de nombres.
- No se puede especificar el tipo subyacente de
enum
, lo que genera confusión, problemas de compatibilidad y hace imposible la declaración de reenvío.
enum class
("enumeraciones fuertes") son de tipo firme y 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
Como se muestra, las enumeraciones trabajo tradicional, como de costumbre, pero ahora se puede calificar opcionalmente con el nombre de la enumeración.
Las nuevas enumeraciones son "clase enum" porque combinan aspectos de enumeraciones tradicionales (valores de nombres) con aspectos de clases (miembros con ámbito y ausencia de conversiones).
Ser capaz de especificar el tipo subyacente permiten la interoperabilidad simple y tamaños garantizados de enumeraciones:
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
También permite la declaración de avance de las enumeraciones:
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
El tipo subyacente debe ser una de las tipos enteros con signo o sin signo; el valor predeterminado es int
.
En la biblioteca estándar, enum
clases se usan para:
- sistemas de cartografía códigos de error específicos: En
<system_error>
: enum class errc
; indicadores de seguridad
- Puntero: En
<memory>
: enum class pointer_safety { relaxed, preferred, strict };
- de E/S de errores de transmisión en: En
<iosfwd>
: enum class io_errc { stream = 1 };
- comunicaciones asíncronas de gestión de errores: En
<future>
: enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
varios de estos han operadores, tales como ==
definido.
¿Has echado un vistazo a [wikipedia] (http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations)? – Nobody
@ Nadie: Sí, miré 'wiki' pero no pude entender cómo usarlo, y cuáles son los beneficios. –