C'è una capacità abbastanza compatibile (§) di refactificare un enum in una classe senza dover riscrivere il tuo codice, il che significa che puoi effettivamente fare ciò che ti chiedevi di fare senza troppe modifiche.
(§) come sottolinea ElementW in un commento, il codice dipendente da type_traits non funzionerà, quindi ad esempio non si può usare auto, ecc. Potrebbe esserci un modo di gestire tali cose, ma alla fine si sta convertendo un enum in una classe, ed è sempre un errore sovvertire C ++
le specifiche enum struct
e enum class
riguardano lo scoping quindi non fanno parte di questo.
Il tuo enum originale è ad esempio 'pet' (questo è solo un esempio!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Lo modifichi ad es. PetEnum (in modo da nasconderlo dal tuo codice esistente).
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Aggiungete una nuova dichiarazione di classe sotto di essa (chiamata con l'enum originale)
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) Ora puoi aggiungere qualsiasi metodo di classe desideri alla tua classe di animali domestici. per esempio. un operatore di stringa
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!";
}
}
Ora puoi usare ad es. 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;
}