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 structund enum classSpezifikationen 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;
}