Existe uma capacidade bastante compatível (§) de refatorar uma enumeração em uma classe sem precisar reescrever seu código, o que significa que efetivamente você pode fazer o que estava pedindo sem muita edição.
(§) como o ElementW aponta em um comentário, o código dependente de type_traits não funcionará, portanto, por exemplo, não se pode usar auto, etc. Pode haver alguma maneira de lidar com essas coisas, mas no final a pessoa está convertendo uma enumeração em uma classe, e é sempre um erro subverter C ++
as especificações enum struct
e enum class
são sobre o escopo, portanto não fazem parte disso.
Seu enum original é, por exemplo, 'animal de estimação' (este é apenas um exemplo!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Você modifica isso para, por exemplo, petEnum (para ocultá-lo do seu código existente).
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Você adiciona uma nova declaração de classe abaixo (nomeada com a enumeração 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) Agora você pode adicionar quaisquer métodos de classe que desejar à sua classe de animais de estimação. por exemplo. um operador de cadeia
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!";
}
}
Agora você pode usar, por exemplo, 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;
}