Kodunuzu yeniden yazmanıza gerek kalmadan bir numaralandırmayı sınıfa yeniden sığdırmak için oldukça uyumlu bir yetenek (§) vardır, bu da çok fazla düzenleme yapmadan yapmak istediğinizi etkili bir şekilde yapabileceğiniz anlamına gelir .
(§) ElementW'nin bir yorumda belirttiği gibi, type_traits bağımlı kodu çalışmaz, bu yüzden biri otomatik kullanamaz, vb. ve C ++ 'ı bozmak her zaman bir hatadır
enum struct
ve enum class
teknik özellikleri bu nedenle bu değil parçasını kapsam hakkındadır.
Orijinal numaralandırma örneğin "evcil hayvan" dır (bu sadece örnek olarak verilmiştir!).
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) Bunu örneğin petEnum olarak değiştirirsiniz (mevcut kodunuzdan gizlemek için).
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) Altına yeni bir sınıf bildirimi eklersiniz (orijinal numaralandırma ile adlandırılır)
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) Artık evcil hayvan sınıfınıza istediğiniz sınıf yöntemlerini ekleyebilirsiniz. Örneğin. bir dize operatörü
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!";
}
}
Şimdi örneğin std :: cout kullanabilirsiniz ...
int main() {
pet myPet = rabbit;
if(myPet != fish) {
cout << "No splashing! ";
}
std::cout << "I have a " << std::string(myPet) << std::endl;
return 0;
}