Modül dersleri (2/2)
Sınıf Şablonları
Tıpkı işlevler gibi sınıflar da bir veya daha fazla veri türüne göre parametrelendirilebilir. Bu, kodu çoğaltmadan herhangi bir veri türüyle çalışan genel veri yapılarını (listeler, kuyruklar, yığınlar veya sarmalayıcılar gibi) tanımlamamıza olanak tanır.
Sınıf Şablonu Tanımlama
Bir sınıf şablonu bildirmek için sınıf tanımından hemen önce template <typename T> sözdizimini kullanırız. Sınıfın içinde üye değişkenleri, dönüş türlerini veya üye işlev parametrelerini tanımlamak için T tür parametresini kullanabiliriz.
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const {
return value;
}
};Örnekleme
Bir sınıf şablonunun bir nesnesini oluştururken, türü köşeli ayraçlar <> arasında açıkça belirtmeliyiz (her ne kadar C++17'den başlayarak derleyici bunu bazı bağlamlarda Sınıf Şablonu Argüman Çıkarımı veya CTAD yoluyla anlayabilir):
Box<int> intBox(10); // T becomes int
Box<double> doubleBox(3.14); // T becomes doubleŞablon Uzmanlığı
Bazen bir sınıf şablonu belirli bir türle başlatıldığında farklı bir davranış sergilemesini isteriz. Bu durumda, template <> sözdizimini ve ardından hedef türünü belirten sınıf tanımını kullanarak tam bir uzmanlık tanımlarız:
// Total specialization for the bool type
template <>
class Box<bool> {
private:
bool value;
public:
Box(bool v) : value(v) {}
void printState() {
std::cout << (value ? "True" : "False");
}
};Kendin dene
T türünde değer adlı özel bir üyeyi, onu başlatan bir yapıcıyı ve değeri döndüren genel yöntem getValue() const'ı içeren Box adında bir sınıf şablonu bildirin.
İpucu göster
'Box' sınıf bildiriminin başına 'template <typename T>' eklemeyi unutmayın.
3 denemeden sonra çözüm mevcut
T türünde ortak üye verileri, Wrapper(T d) yapıcısı ve verileri std::cout'a yazdıran print() yöntemiyle birlikte bir sınıf şablonu Wrapper<T> bildirin. Ardından, Print() yönteminin tek tırnak içine alınmış karakteri (örneğin, A yerine 'A') yazdırdığı Wrapper<char> için tam bir uzmanlık oluşturun.
İpucu göster
'Sarmalayıcı<karakter>'in toplam uzmanlığını belirtmek için 'şablon <>' kullanın.
3 denemeden sonra çözüm mevcut