Istnieje całkiem kompatybilna zdolność (§) do refaktoryzacji wyliczenia na klasę bez konieczności przepisywania kodu, co oznacza, że efektywnie możesz robić to, o co prosiłeś, bez zbytniej edycji.
(§) jak ElementW wskazuje w komentarzu, kod zależny od type_traits nie będzie działał, więc np. Nie można użyć auto, itp. Może być jakiś sposób na takie rzeczy, ale w końcu jest to konwersja wyliczenia na klasę, i zawsze błędem jest obalanie C ++
enum struct
i enum class
specyfikacje są o określenie zakresu, więc nie brać w tym udziału.
Twoje oryginalne wyliczenie to np. „Zwierzak” (to jest tylko przykład!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Zmieniasz to na np. PetEnum (aby ukryć go przed istniejącym kodem).
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Dodajesz pod nią nową deklarację klasy (nazwaną oryginalnym wyliczeniem)
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) Możesz teraz dodać dowolne metody klas do swojej klasy zwierząt domowych. na przykład. operator łańcuchowy
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!";
}
}
Teraz możesz użyć np. 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;
}