Ada kemampuan yang cukup kompatibel (§) untuk membuat ulang enum ke dalam kelas tanpa harus menulis ulang kode Anda, yang berarti bahwa secara efektif Anda dapat melakukan apa yang Anda minta tanpa terlalu banyak mengedit.
(§) seperti yang ditunjukkan ElementW dalam komentar, kode dependen type_traits tidak akan berfungsi, jadi misalnya seseorang tidak dapat menggunakan otomatis, dll. Mungkin ada beberapa cara untuk menangani hal-hal seperti itu, tetapi pada akhirnya seseorang mengubah enum menjadi sebuah kelas, dan selalu merupakan kesalahan untuk menumbangkan C ++
yang enum struct
dan enum class
spesifikasi tentang scoping sehingga bukan bagian dari ini.
Enum orisinal Anda adalah misalnya 'hewan peliharaan' (ini hanya sebagai contoh!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Anda memodifikasinya menjadi misalnya petEnum (untuk menyembunyikannya dari kode yang ada)
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Anda menambahkan deklarasi kelas baru di bawahnya (dinamai dengan enum asli)
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) Sekarang Anda dapat menambahkan metode kelas apa pun yang Anda suka ke kelas hewan peliharaan Anda. misalnya. operator string
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!";
}
}
Sekarang Anda dapat menggunakan mis 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;
}