Fonksiyon Şablonları (Function Templates)

06:27 , ,
Template'in kelimesinin anlamı şablon ve C++'daki function template olarak kullanım şekli de fonksiyonların şablon olarak yazılmasına olanak sağlamasıdır. Bu sayede yazılan fonksiyonun farklı parametre  türlerine  uygun olarak derleyici tarafından istenen biçimlerde yazılmasına olanak sağlamasıdır. Bu sayede C'de olduğu gibi bir fonksiyonu farklı farklı tipler için ayrı ayrı yazmak yerine, tek bir  fonksiyon şablonu yazıp  bunu farklı farklı tipler için kullanım esnekliği sağlamaktadır.

template <typename T>
return-type func-name(parameter list) {
   // body of function

Template yazarken tip oluşturmak için typename veya class anahtar kelimesi kullanılabilir. İkisi de aynı anlama gelmektedir. Ama class kelimesinin kullanılması yanlış anlamlara çıkabileceğinden dolayı typename kelimesini kullanmak daha doğru olacaktır.

Function Template Örneği

C++11 ile gelen Variadic Function Template örneği ise aşağıdaki gibidir. Temelde şablon fonksiyonların parametreleri sabit ama veri tipleri değişkendir. Fakat variadic versiyonunda ise parametre sayısı da değişken biçimdedir. Bu konu şimdilik bir örnekle açıklansa da daha sonra başlı başına bir yazının konusu olacaktır.


Variadic Function Template Örneği
Fonksiyon şablonlarına parametreleri değer veya referans yoluyla geçilmesine ilişkin oluşabilecek problemleri içeren bir kod örneği aşağıda verilmiştir.


Eğer kodun içinde <int&> kısmını kaldırırsak aşağıdaki gibi bir hatayla karşılaşırız. Bunun nedeni type deduction yaparken compiler ilk parametreye bakarak T türünün int olduğunu düşünmekte fakat ikinci parametreye baktığında ise T türünün int& olduğuna karar vermekte ve hata mesajıyla karşılaşılmaktadır. Bu nedenle compiler'a T türünü doğrudan söyleyerek problemi aşabiliriz. 


Yazdığımız template için compiler'ın deduction yapmadan doğrudan kendimiz türünü bildirmek için de yukarıdaki örneğe benzer şekilde fonksiyonun yanına <int,double, ...> biçiminde belirtebiliriz.

Note:

  • Template fonksiyonumuzdaki parametreleri ve geri dönüş tipini referans yapmak daha iyi  performans sağlanmasına yardımcı olacaktır.