Es gibt eine ziemlich kompatible Fähigkeit (§), eine Aufzählung in eine Klasse umzuwandeln, ohne Ihren Code neu schreiben zu müssen, was bedeutet, dass Sie effektiv das tun können , was Sie wollten, ohne zu viel zu bearbeiten.
(§) Wie ElementW in einem Kommentar hervorhebt , funktioniert type_traits- abhängiger Code nicht, z. B. kann man nicht auto usw. verwenden. Es kann eine Möglichkeit geben, mit solchen Dingen umzugehen , aber am Ende konvertiert man eine Aufzählung in eine Klasse. und es ist immer ein Fehler, C ++ zu untergraben
Die enum struct
und enum class
Spezifikationen beziehen sich auf das Scoping, sind also nicht Teil davon.
Ihre ursprüngliche Aufzählung ist zB "Haustier" (dies ist nur ein Beispiel!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Sie ändern dies in zB petEnum (um es vor Ihrem vorhandenen Code zu verbergen).
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Sie fügen darunter eine neue Klassendeklaration hinzu (benannt mit der ursprünglichen Aufzählung).
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) Sie können Ihrer Haustierklasse jetzt beliebige Klassenmethoden hinzufügen. z.B. ein String-Operator
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!";
}
}
Jetzt können Sie zB std :: cout verwenden ...
int main() {
pet myPet = rabbit;
if(myPet != fish) {
cout << "No splashing! ";
}
std::cout << "I have a " << std::string(myPet) << std::endl;
return 0;
}