Hay una capacidad bastante compatible (§) para refactorizar una enumeración en una clase sin tener que reescribir su código, lo que significa que efectivamente puede hacer lo que estaba pidiendo sin demasiada edición.
(§) como ElementW señala en un comentario, el código dependiente de type_traits no funcionará, por ejemplo, uno no puede usar auto, etc. Puede haber alguna forma de manejar tales cosas, pero al final se está convirtiendo una enumeración en una clase, y siempre es un error subvertir C ++
las especificaciones enum struct
y enum class
son sobre el alcance, por lo que no forman parte de esto.
Su enumeración original es, por ejemplo, 'mascota' (¡esto es solo un ejemplo!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Modifica eso a, por ejemplo, petEnum (para ocultarlo de su código existente).
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Agrega una nueva declaración de clase debajo de ella (nombrada con la enumeración original)
class pet {
private:
petEnum value;
pet() {}
public:
pet(const petEnum& v) : value{v} {} //not explicit here.
operator petEnum() const { return value; }
pet& operator=(petEnum v) { value = v; return *this;}
bool operator==(const petEnum v) const { return value == v; }
bool operator!=(const petEnum v) const { return value != v; }
// operator std::string() const;
};
(3) Ahora puede agregar los métodos de clase que desee a su clase de mascota. p.ej. un operador de cadena
pet::operator std::string() const {
switch (value) {
case fish: return "fish";
case cat: return "cat";
case dog: return "dog";
case bird: return "bird";
case rabbit: return "rabbit";
case other: return "Wow. How exotic of you!";
}
}
Ahora puede usar, por ejemplo, std :: cout ...
int main() {
pet myPet = rabbit;
if(myPet != fish) {
cout << "No splashing! ";
}
std::cout << "I have a " << std::string(myPet) << std::endl;
return 0;
}