Cuando tenemos,

struct E { enum E_ { HELLO }; }; //'E' is inheritable

entonces, ¿por qué necesitamos,

enum class E { HELLO };  //'E' is not inheritable

OMI 2da versión no ofrece más funciones que el 1er. No creo que enum class es introducido para guardar 2 llaves {};! Me estoy perdiendo cualquier aspecto importante ?

Como una cuestión menor, ¿hay alguna diferencia entre enum class y enum struct otros de sintaxis (porque ambos tienen public especificador de acceso) ?

  • ¿Cómo se referencia el tipo de la enumeración dentro de E en el primer ejemplo?
  • Usted podría estar interesado en la lectura de este, a continuación,.
  • llano de las enumeraciones son no tipo de seguros, tiene un aplicación definida por el tipo subyacente, no fuertemente ámbito de open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf
InformationsquelleAutor iammilind | 2011-08-04

5 Comentarios

  1. 125

    Además de lo ya mencionado, una de las ventajas de enum class es mejor tipo de seguridad – el enum class enumeradores no convertir implícitamente a enteros.

    • Por CIERTO, hay en C++ existente, o no existen en la nueva versión, una buena manera de especificar que una variable debe tener un tipo de enumeración sobre la cual los operadores bit a bit debe ser usable? La única enfoques que he encontrado son para declarar la variable a ser un «int» (sólo el uso de la enumeración a nombre de los valores) o bien definir explícitamente todos los operadores que se supone que son para trabajar en el enum. El hecho de que dichos operadores no funcionan en las enumeraciones por defecto parece que uno de los grandes ‘romper’ los cambios que va de C a C++.
    • probablemente esta restricción se aplica debido a que un valor de tipo de enumeración es intuitivamente se espera que tenga un valor igual a uno de sus enumeradores (y una combinación bit a bit de los enumeradores no encaja). Así, en el momento de convertir un enumerador para un entero (con el fin de hacer bit a bit ops, por ejemplo), pero en realidad ya no es una enumeración.
    • Ese es el concepto, pero hay muchas situaciones donde se tiene una variable o campo cuyo significado lógico es ser una combinación bit a bit de bandera en particular constantes. Uno podría declarar una variable de este tipo de campo es un entero, pero en C sin duda, sería más idiomáticas que declarar como una enumeración, así como para mostrar la relación entre la variable de campo y las banderas de las constantes. Dado que C++ se suponía iba a ser en gran medida compatible con C, me resulta extraño que un idiomáticas de uso sería rechazado.
    • href=»http://stackoverflow.com/questions/13385744/how-to-make-a-enum-with-values-over-max-int-allowed/13385880#13385880″ title=»cómo hacer un enum con valores por encima de max int permitido»>stackoverflow.com/questions/13385744/… busque También en los comentarios donde se habla de ese problema y cómo solucionarlo mediante el uso de potentes tipos
    • Hago un montón de trabajo con los sistemas integrados y de código que tiene para interactuar con ellos. Como tal, el uso de diferentes integral constantes para representar máscaras de bits ofrece al menos dos buenas ventajas en comparación con las enumeraciones: (1) el código escrito, utilizando técnicas tales funciona de manera idéntica en C y C++; (2) es fácil para serializar y deserializar datos. En versiones C con el anonimato de los sindicatos, el uso de un campo de bits de la unión ed con un byte sería una buena alternativa; no estoy seguro si C++ admite que, a pesar de que.
  2. 93

    ¿Realmente necesitamos «clase enum» en C++0x?

    No, nosotros no «necesita» enum class. Podemos obtener la suficiente funcionalidad equivalente en otras formas. Pero por esa lógica, que no «necesita» un montón de cosas en C++. Nosotros no «necesita» funciones virtuales y a la herencia, ya que podemos implementar de forma manual con vtables y tal. Nosotros no «necesita» de las funciones de miembros; estos pueden ser emulados por tener ellos toman un argumento adicional.

    Características del lenguaje existe para hacer la vida más fácil a los programadores. Sólo porque algo puede hacer manualmente, no significa que se debe.

    enum class tiene las siguientes propiedades:

    1. Es fácil de entender, refleja cómo las enumeraciones de trabajo en otros idiomas.
    2. Requiere relativamente poco de los escritores de compiladores. Contraste el esfuerzo de implementación con características como el valor de r referencias, varadic plantillas, o definido por el usuario literales.
    3. Que no rompe la sintaxis de cualquier manera. Puede parecer un poco raro al principio para ver enum class, pero eso es cierto para la mayoría de las nuevas características. Una vez que te acostumbras a él, está bien.
    4. Es 100% compatible con versiones anteriores, en que no redefinir cómo regular las enumeraciones de trabajo. Viejo estilo de las enumeraciones de trabajo el mismo que se utiliza para.
    5. Que le evita tener que escribir un montón de código repetitivo. Boost tiene una macro para crear el efecto de enum class definiciones. Sin esta macro, usted tiene que gastar un poco de esfuerzo para lograr que todos los casos de esquina para el trabajo. Y aún así, alguien tenía que escribir y depurar esa macro.

    Así que no, no «necesita» de ellos. Pero son todavía una gran adición a la lengua.

    • Bravo, Esto también se aplica a cada mejora en cualquier área de cualquier campo.
    • +1. Para hacer el punto, incluso más obvio: «Usted también no necesita para llevar los pantalones, pero su vida es probable que sea mucho más difícil si no.»
    • justo sobre el punto 4. (buenos viejos enumeraciones) esto es cierto, pero una extensión realizados han sido: los enumeradores son ahora accesibles a través ámbito (calificado) sintaxis. porque cito «que permite a los programadores escribir enum-agnóstico código que opera en ambos tipos de enumeraciones».
  3. 24

    En el primer caso, el tipo de HELLO no es E, mientras que en el segundo caso, el tipo de HELLO es E.

    Para una buena demostración de por qué esto es importante, ver a Howard Hinnant, la respuesta a «»clase enum» emulación o sólida alternativa para MSVC 10.0.»

    enum class y enum struct son «equivalentes semánticamente» (es decir, el mismo), por C++0x IFD, §7.2/2.

    • He leído la respuesta. Que el problema podría haber sido fácilmente fijado por la sobrecarga de operator ostream con my_enum::type; ideone.com/hvgk4. Esto es sólo un pequeño cambio, que enum class habría proporcionado fácilmente. Pero aún así vale ?
    • Sí, definitivamente es todavía vale la pena: es un pequeño, auto-contenida, además el lenguaje que permite limpiador de uso de las enumeraciones y sustituye a una serie de kludges (muchos de los cuales son incorrectos). No es cambiar el juego como r-value referencias, expresiones lambda, o variadic plantillas, pero eso no quiere decir que no es una característica útil.
    • «Que el problema podría haber sido fácilmente fijo» … pero… en el costo de hacer una constante en tiempo de compilación de un miembro de la variable (además de que, aunque insignificante, teniendo que mantener una dirección para la estructura, incluso si todos los datos es constante o no hay datos, el compilador debe estar preparado que intenta tomar la estructura de la dirección, no se puede saber con certeza que no).
  4. 16

    Creo que usted necesita para leer en las otras ventajas de estos nuevos enumeraciones

    • usuario define el tamaño de la
    • ámbito de los valores (no alcance más general abarrotar de valores)
    • ninguna conversión implícita de tipos integrales
    • adelante declaración de las enumeraciones (mayor mejora de las enumeraciones en Api)

    http://www.stroustrup.com/C++11FAQ.html#enum

  5. 2

    Sí, lo tenemos. Parece que nadie se señaló antes. ¿Qué pasa si usted necesita para establecer el tamaño de un enum y mantener siempre según el estándar de C++? enum class puede hacer. Y con tipo de seguridad como ya se ha mencionado. Es reducir tanto de posibles errores en el código y el desorden a la mezcla de int y enums. Que no fue nunca la misma cosa para mí. Increíble. por ejemplo, enum class foo : int16_t { ... } estoy seguro de que cada miembro es un int16_t y no, hasta la implementación de decidir qué es lo «mejor» para mí.

    EDICIÓN:

    También, podemos tener valores duplicados (no nombres) en la lista. Que hacer un montón de sentido según el contexto.

    • Usted puede también fijar el tipo subyacente de un ámbito de enum en C++11.
    • Y tener valores duplicados en la lista. Hace un montón de sentido. 🙂
    • Se duplicaron los valores siempre prohibido para cualquier tipo de enumeración en C++98 o C++11?

Dejar respuesta

Please enter your comment!
Please enter your name here