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.