ProgramlamaC++ Geliştirici

C++'da şablonlar (templates) nedir? Hangi tür şablonlar vardır? Şablon tasarımı ve kullanımı sırasında hangi zorluklar ve hatalar ortaya çıkabilir? Bir sınıf ve fonksiyon şablonu örneği gösterin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Ş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:

  • Fonksiyon şablonları: Farklı türler için tek bir işlev oluşturmanıza olanak tanır.
  • Sınıf şablonları: Farklı türlerle çalışan sınıflar oluşturmanıza olanak tanır.
  • Değer parametreli şablonlar: Parametreleri yalnızca türlerle değil, sabit değerlerle de parametrize edebilirsiniz.

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; }

Kandırmaca soru.

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 }

Konu ile ilgili bilgi eksikliği nedeniyle oluşan gerçek hata örnekleri.


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ı.