Şablonlar (templates) — C++'da farklı veri türleriyle çalışabilen genel sınıflar ve fonksiyonlar oluşturmayı sağlayan bir mekanizmadır ve kodun tekrarlanmasını önler. Bu, STL konteynerlerinin, algoritmaların ve birçok genel programlama deseninin uygulanmasının temelini oluşturur.
Şablon türleri:
Sınıf şablonu örneği:
template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };
Fonksiyon şablonu örneği:
template<class T> T add(const T& a, const T& b) { return a + b; }
Sadece bir şablon sınıfının bir metodunu açıkça uzmanlaştırmak mümkün mü, tüm sınıfı uzmanlaştırmadan? Evet, bu şekilde yapılabilir.
Cevap:
Evet, mümkün. Tüm sınıfı uzmanlaştırmak zorunda değilsiniz; sadece belirli bir metodu uzmanlaştırabilirsiniz:
template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // int için yalnızca bar metodunun uzmanlaştırılması // Uygulama }
Hikaye
Bir projede karşılaştırma için bir fonksiyon şablonu yazıldı:template <typename T> bool cmp(const T& a, const T& b) { return a < b; }
<operatörüne sahip olmayan türlerle kullanıldığında, hatanın kaynağını bulmak zordu; çünkü tanı sadece şablonun örneklenmesinde veriliyordu, tanımında değil.
Hikaye
Geliştirici, kullanıcı tanımlı bir sınıf için şablon işlevinde toplama yapmaya çalıştı, ancak+operatörünü aşırı yüklemeyi unuttu. Bu, bu sınıf ile yapılan ilk çağrıda hata aldı.
Hikaye
Sınıf şablonuna dayanan bir konteyner geliştirirken, şablon türüne bağlı olmayan bir yöntem yapıldı ancak açık uzmanlaştırma olmadan sınıfın dışına alındı:template<> int MyContainer<int>::size() const { ... }Bu, uzmanlaştırma ilan edildiği için derleme hatasına neden oldu, ancak tüm türler için düzgün bir şekilde uygulanmadı.