Template, c++ dilinin desteklediği bir mekanizmadır. Bütün veri türlerini desteklemekte ve scope içersinde işlem yapabilmekteyiz.
1. Fonksiyon Template'i
Fonksiyon template'i çağırıldığı veri türüne göre davranış gösterir. Örnek olarak aşağıdaki kod bloğunu inceleyebiliriz.
Kod:
#include <iostream>
using namespace std;
template <typename T>
inline void my_swap(T& b, T&c)
{
T temp = b;
b=c;
c=temp;
}
int main()
{
int a = 1;
int b = 2;
cout<< "a:" <<a<<" "<< "b: "<<b<< endl;
my_swap(a,b);
cout<< "a:" <<a<<" "<< "b: "<<b<< endl;
string c = ".cpp";
string d = ".c";
cout<<"c: " << c<<" "<< "D: "<< d<< endl;
my_swap(c,d);
cout<<"c: " << c<<" "<< "D: "<< d<< endl;
}
1.1. Fonksiyon Template'lerin tanımlanması
Örneğe baktığımızda, template <typname T> görmekteyiz. burada bir template olduğunu ve içinde T parametresine sahip olduğunu belirtmekteyiz. Typename keyword'u aynı zamanda type parametresi olarakta adlandırılır. mySwap fonksiyonuna baktığımızda ise T türünden 2 tane parametre aldığını görmekteyiz. böylece fonksiyon template tanımlamış olduk.
Tekrar örneği incelediğimizde, dikkat edelim ki, programcının insantiation ayırmasına gerek kalmadı. Bunun sebebi fonksiyon template'i iki defa derlenir. 1. derlemede sadece, sytanx kontrol edilir iken, 2 derlemede bütün çağırların gerçeli olduğunu kontrol eder.
1.2. Argüman Tanımlaması
Bir fonksiyon template'i çağırdığımızda, (örn: max()), template parametrelerini, geçerli olan argüman belirler ve hiç bir otomatik tür dönüşümüne izin vermez. Bütün T parametleri bir birinle tamamen eşleşmelidir.
Kod:
template < typename T>
inline T const &max (T const& t1, T const t2);
max(4,2); // hiç bir problem yok. İki Argümanda int.
max(4,4.2); // Hata: İlk argüman int, ikinci argüman double or float
Aslında hatalı durumlardan kurtulacağımız 3 tane yol vardır.
1. Yol : static casting
Kod:
max(static_cast<double>(4),4,2)
2. T parametresinin türünü belirlemek
Kod:
max<double>(4,4,2)
3. Farklı türlerde parametre belirlemek
Kod:
template < typename T, typname P>
inline T const &max ( T const& t1, P const p2)
{
return t1<p2 ? p2: t1;
}
max(4,6.2); // Bu durum doğru ama T parametersi integer olduğundan 6.2 değerini 6 olarak döndürecektir/CODE]
1.3 Return türü belirlemek
[CODE]
template <typename T1, typename T2, typename RT>
inline RT max( T1 const& a, T2 const &b);
max <int,double,double>(4,4,2);
bu durumda, gördündüğü gibi fonksiyonun türü, double, birinci parametrenin int ikinci parametrenin ise double olduğunu belirtik. yada bir başka yöntem ise sadece fonksiyon türünü belirmede.
Kod:
template <typename RT,typename T1, typename T2 >
inline RT max( T1 const& a, T2 const &b);
max <double>(4,3,2); // bu durumda 4, double türünde dönecektir. 4.0 sıfır olarak
1.4. overloading fonksiyon Template
Sıradan fonksiyonlar gibi , fonksiyon templateleride overload olabilir.
Kod:
int max( T1 const& a, T2 const &b);
template <typename T>
inline T max( T const& a, T const &b);
template <typename T>
inline T max( T const& a, T const &b, T const &c)
{
return max (max(a,b),c);
}