Có một khả năng khá tương thích (§) để cấu trúc lại một enum vào một lớp mà không phải viết lại mã của bạn, điều đó có nghĩa là bạn có thể làm những gì bạn yêu cầu một cách hiệu quả mà không cần chỉnh sửa quá nhiều.
(§) như ElementW chỉ ra trong một nhận xét, mã phụ thuộc type_traits sẽ không hoạt động, vì vậy, ví dụ: người ta không thể sử dụng tự động, v.v. và luôn luôn là một sai lầm khi lật đổ C ++
các enum struct
và enum class
đặc điểm kỹ thuật về Phạm vi nên không nằm trong này.
Enum ban đầu của bạn là ví dụ 'pet' (đây chỉ là một ví dụ!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Bạn sửa đổi điều đó thành ví dụ petEnum (để ẩn nó khỏi mã hiện tại của bạn).
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Bạn thêm một khai báo lớp mới bên dưới nó (được đặt tên bằng enum gốc)
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) Bây giờ bạn có thể thêm bất kỳ phương thức lớp nào bạn muốn vào lớp thú cưng của bạn. ví dụ. một toán tử chuỗi
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!";
}
}
Bây giờ bạn có thể sử dụng ví dụ 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;
}