Существует довольно совместимая возможность (§) реорганизовать перечисление в класс без необходимости переписывать ваш код, что означает, что вы можете эффективно выполнять то, что просили, без слишком большого редактирования.
(§), как указывает ElementW в комментарии, зависимый от type_traits код работать не будет, поэтому, например, нельзя использовать auto и т. Д. Может быть какой-то способ обработки таких вещей, но в конце можно преобразовать перечисление в класс, и это всегда ошибка подорвать C ++
enum struct
и enum class
спецификация о обзорных так не части этого.
Ваше оригинальное перечисление, например, «домашнее животное» (это только для примера!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Вы изменяете это, например, на petEnum (чтобы скрыть его от существующего кода).
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Вы добавляете новое объявление класса под ним (названное с оригинальным перечислением)
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) Теперь вы можете добавлять любые классовые методы, которые вам нравятся, в класс вашего питомца. например. оператор строки
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!";
}
}
Теперь вы можете использовать, например, 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;
}