Şablon [template] da dallı budaklı bir konu olduğu için ben ayrıntılarını daha sonra D.ershane'de anlatmayı düşünüyorum.
Burada en yaygın ve kolay kullanımını göstereceğim. D'nin şablonlarının C++'nınkilerden 16.7 kat :p daha güçlü ve kullanışlı olduklarını aklımızda tutarak...
C ve türevi diller tür konusunda sağlamcıdırlar. Türler arasından otomatik dönüşümler de olur ama int'ler için yazılmış bir ikili arama algoritması double'lar için çalışmaz. Ya her tür için ayrı bir fonksiyon yazmak gerekir, ya da qsort'un kulladığı void* gibi tür güvenliğini çöpe atan ara durumlara düşmek gerekir.
Şablonlar, algoritmanın bir kere yazılmasını ve uyan türlerin hepsi için çalışmasını sağlarlar.
Basit olsun diye büyüğünün_karesi diye bir fonksiyon kullanacağım (burada ?: işlecinin anlamı da anlaşılıyordur herhalde):
int büyüğünün_karesi(int birinci, int ikinci)
{
int büyük = (birinci > ikinci) ? birinci : ikinci;
return büyük * büyük;
}
double büyüğünün_karesi(double birinci, double ikinci)
{
double büyük = (birinci > ikinci) ? birinci : ikinci;
return büyük * büyük;
}
Sonuçta her tür için ayrı bir fonksiyon yazmış olduk... Ama dikkat edilirse, fonksiyonun içeriği her tür için aynıdır. Şablon olanağı, derleyiciye "türün ismini şimdi söylemiyorum, sonra programdaki kullanışına bakarak sen anla; ve sanki ben her tür için ayrı ayrı yazmışım gibi derle" demek gibidir.
Şimdi int ve double demeden bu işi halledeceğiz. Geleneksel olarak, ismini söylemeden bıraktığımız türe T denir:
T büyüğünün_karesi(T)(T birinci, T ikinci)
{
T büyük = (birinci > ikinci) ? birinci : ikinci;
return büyük * büyük;
}
Tek bir fonksiyon yazmak yeter!
Orada iki fark var:
1) int veya double yerine T dedik
2) Fonksiyonun ismini büyüğünün_karesi yerine büyüğünün_karesi(T) diye yazdık; bu, "T, kullanımına göre anlaşılacak olan bir türdür" demektir
Şimdi o tek fonksiyonu kullanarak hem int hem double için çağırabiliriz, ve derleyici o fonksiyondan kendisi iki adet üretir:
void main()
{
büyüğünün_karesi(3, 4);
büyüğünün_karesi(1.1, 2.2);
}
O kodda türlerin int ve double olduklarını derleyici anlar. Bazı durumlarda gerektiğinde türün ne olduğu elle yazılmak zorunda kalınabilir:
büyüğünün_karesi!(int)(3, 4);
Tek parametre alan şablonlarda D'nin bir kestirme olanağı da var:
büyüğünün_karesi!int(3, 4);
Yani şablon, algoritmayı (veya fonksiyonu) tek kere yazdığımız ve derleyicinin gereken türler için kod ürettiği bir düzenektir.
Sınıf şablonları da vardır ama benzerliğini göstermek dışında ayrıntıya girmeyeceğim:
import std.stdio;
class Çift(T) // <-- T buraya koyulur
{
T birinci_;
T ikinci_;
this(T birinci, T ikinci)
{
birinci_ = birinci;
ikinci_ = ikinci;
}
void göster()
{
writeln("elimde iki adet ", T.stringof, " var: ",
birinci_, " ve ", ikinci_);
}
}
void main()
{
auto int_çifti = new Çift!int(1, 2);
int_çifti.göster();
auto double_çifti = new Çift!double(1.1, 2.2);
double_çifti.göster();
}
Tek bir sınıf yazdığımız halde int ve double için ayrı ayrı üretilir. Onun çıktısı şöyle:
elimde iki adet int var: 1 ve 2
elimde iki adet double var: 1.1 ve 2.2
KAYNAK=
sŞablon ne işe yarar?