unidad studio programacion para descargar desarrollo avanzado aplicaciones c++ enums c++11 enum-class

c++ - studio - ¿Es posible definir manualmente una conversión para una clase de enumeración?



manual de programacion android (3)

No puedes definir operadores de cast no miembros en C ++. Y ciertamente no puedes definir funciones de miembro para enumeraciones. Por lo tanto, le sugiero que realice funciones gratuitas para convertir su enumeración a otros tipos, de la misma forma en que implementaría los operadores de conversión.

p.ej

bool TestToBool(enum_e val) { return false; } const char *TestToString(enum_e val) { return "false"; }

Hay una buena forma de asociar esas enumeraciones a bools, debes dividirla en dos archivos .h y .cpp. Aquí está si ayuda:

enum.h

/////////////////////////////// // enum.h #ifdef CPP_FILE #define ENUMBOOL_ENTRY(A, B) { (enum_e) A, (bool) B }, struct EnumBool { enum_e enumVal; bool boolVal; }; #else #define ENUMBOOL_ENTRY(A, B) A, #endif #ifdef CPP_FILE static EnumBool enumBoolTable[] = { #else enum enum_e { #endif ENUMBOOL_ENTRY(ItemA, true), ENUMBOOL_ENTRY(ItemB, false), ... }; bool EnumToBool(enum_e val);

enum.cpp

/////////////////////////////// // enum.cpp #define CPP_FILE #include "enum.h" bool EnumToBool(enum_e val) //implement

No lo compilé, así que tómalo con calma si tiene algún error :).

Normalmente, puede definir una conversión para una clase usando la siguiente sintaxis:

class Test { public: explicit operator bool() { return false; } };

¿Hay alguna manera de hacer esto o algo similar para una enum class ?


No, no es.

En realidad, una enum class no es clase en absoluto. La palabra clave de la class solo se usa porque cambiar repentinamente la enum codificada a una enum ámbito tendría que significar volver a trabajar todos los códigos de enumeraciones. Así que el comité decidió que para distinguir entre las enums de estilo nuevo y las antiguas, las nuevas se etiquetarían con class , porque ya es una palabra clave, por lo que ninguna enum podría haber sido llamada class en C ++. Podrían haber elegido otro, de todos modos no habría tenido mucho más sentido.

Sin embargo, a pesar de la palabra clave class , todavía son enumeraciones regulares en las que solo los enumeradores (y potencialmente los valores asignados a ellos) están permitidos dentro de los corchetes.


No, pero puedes hacer que un tipo de clase normal actúe como una clase enum, usando miembros y constructores constexpr . Y luego puede agregar todas las funciones de miembros adicionales que desee.