Varsayılan parametrelerle birlikte şablonlar, C++'ta genel programlama için güçlü bir mekanizmadır.
Konuya Giriş:
STL kütüphanesi şablonlarla başladı. Daha sonra şablonlu fonksiyonlar ve sınıflar için varsayılan değerler belirtme imkanı geldi, böylece şablonlar daha evrensel hale geldi ve kodun genişletilebilirliğini desteklemeye başladı.
Sorun:
Normal fonksiyonlar ve şablonlar için aşırı yüklemeler mevcut olduğunda, beklenmedik çelişkiler meydana gelebilir ve özel durumlarda belirsizlikler oluşabilir. Şablonlardaki varsayılan parametreler esnekliği artırabilir, ancak genellikle karmaşık derleme hatalarına yol açar.
Çözüm:
Varsayılan değerlerin sayısını mümkün olduğunca azaltmak en iyisidir, özellikle de şablon dışı versiyonlarla örtüşmeler varsa. Fonksiyon çağrılarında kesin eşleşme, şablonlar yerine normal fonksiyonlara öncelik verir.
Kod örneği:
template<typename T = int> T multiply(T a, T b = T(2)) { return a * b; } int multiply(int a, int b) { return a + b; }
multiply(5, 4) çağrısı int multiply(int, int) fonksiyonunu seçecek, multiply<>(5) çağrısı ise şablonu çağıracak ve b'nin değeri 2 olacak.
Ana özellikler:
Şablon fonksiyonunun bir sonraki tanımında varsayılan parametreleri bildirebilir miyiz?
Hayır, varsayılan değer yalnızca bir yerde (genellikle bildirimde) belirtilmelidir; aksi takdirde derleme hatası olur.
Şablon ile şablonsuz fonksiyon arasında belirsizlik olduğunda ne olur? Derleyici neye öncelik verir?
Derleyici, argümanlar kesin olarak uygun olduğu sürece her zaman şablonsuz fonksiyonu tercih eder. Şablon, kesin bir eşleşme olmadığında çağrılacaktır.
Şablon parametre türü olmayan bir parametre için varsayılan değerleri belirtebilir miyiz (örneğin, sayı için)?
Evet, örneğin:
template<typename T, int N = 8> class Array { T data[N]; };
Olumsuz Durum
Aynı parametreler ve varsayılan değerlerle hem şablonlu hem de şablonsuz fonksiyon tanımlanır. Bir modülde çağrı istendiği gibi çalışırken, diğerinde beklenmedik bir şekilde yanlış fonksiyon versiyonu seçilir.
Artılar:
Eksiler:
Olumlu Durum
Kesişen konfigürasyonlar için şablonlu ve şablonsuz fonksiyonlar için açıkça farklı isimlendirmeler yapılır, varsayılan değer yalnızca bir versiyonda bulunur.
Artılar:
Eksiler: