Il existe une capacité assez compatible (§) pour refactoriser une énumération dans une classe sans avoir à réécrire votre code, ce qui signifie que vous pouvez effectivement faire ce que vous demandez sans trop de modifications.
(§) comme ElementW le souligne dans un commentaire, le code dépendant de type_traits ne fonctionnera pas, donc par exemple on ne peut pas utiliser auto, etc. Il peut y avoir un moyen de gérer ce genre de choses, mais à la fin, on convertit une énumération en classe, et c'est toujours une erreur de subvertir C ++
les spécifications enum struct
et enum class
concernent la portée, donc ne font pas partie de cela.
Votre énumération d'origine est par exemple "animal de compagnie" (ceci n'est qu'à titre d'exemple!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Vous modifiez cela en par exemple petEnum (afin de le cacher de votre code existant).
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Vous ajoutez une nouvelle déclaration de classe en dessous (nommée avec l'énumération d'origine)
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) Vous pouvez maintenant ajouter les méthodes de classe que vous aimez à votre classe familière. par exemple. un opérateur de chaîne
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!";
}
}
Vous pouvez maintenant utiliser par exemple 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;
}