Існує досить сумісна здатність (§) перетворювати перерахунок на клас без необхідності переписувати код, а це означає, що ефективно ви можете робити те, що просили, не надто багато редагуючи.
(§) як вказує ElementW у коментарі, залежний код type_traits не працюватиме, тому, наприклад, не можна використовувати авто тощо. і завжди є помилкою підривати 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;
}