Ak das pred triedu/strukturu alebo funkciu (v pripade c++11 aj using) klucove slovo template a za nim v hranatych zatvorkach definujes template parametre (typy alebo integer).
template <class T, int I>
struct B{
T[I] t;
I size()const{return I;}
typedef T type;
};
template <typename T, class U, struct X> //typename, class a struct su v tomto pripade ekvivalentne
T fnc(U& u, const X& x){
//...
}
Syntax je rovnaka aku pri normalnych triedach a funkciach.
Potom tu je specializacia templatov. Triedy mozu mat ciastocnu specializaciu, funkcie len uplnu specializaciu:
//ciastocna specializacia:
template <class T>
struct B<T, 23>{
//telo moze byt uplne ine ako v povodnej triede!! :
//...
};
//uplna specializacia:
template <>
struct B<int, 24>{
//telo moze byt uplne ine ako v povodnej triede!! :
//...
};
//funkcia moze mat len uplnu specializaciu:
template <> //typename, class a struct su v tomto pripade ekvivalentne
int fnc<int, float, char>(float& u, const char& x){
//...
}
//alebo skratena verzia:
template <>
int fnc(float& u, const char& x){
//...
}
Pouzitie templatov:
B<bool, 34> b; //pouzies template triedu B
int i = fnc<int, float, double>(7, 3.14f, 6.28lf);
//alebo:
long l = fnc<long>(7, 3.14f, 6.28lf); //dva template parametre sa vydedukuju z parametrov funkcie, prvy parameter sa pouziva ako navratova hodnota a ten sa nemoze vydedukovat
Templaty sa prekladaju az v momente ked ich pouzies a template parametre sa nahradia za konkretne typy/cisla.
Samozrejme su tu este zlozitejsie veci ako template template parametre, vnorene templaty a pristupovanie k prvkom dedeneho templatu z ineho templatu
Edit:
V c++11 je to rozsirene este aj o variadic templaty:
void fnc(){/*nic*/}
template <class A, class As...>
void fnc(A a, As... args){
cout << sizeof...(As) << ": " << a;
fnc(args...); //rekruzivne volani templatu, ale nie je to rekruzia
}
a v c++14 (c++1y) sa zrejme pridaju este zjednodusene koncepty ktore to este spravja zlozitejsie, hlavne pravidla overloadingu template parametrov na zaklade konceptov :)
takze je dobre sa zacat zaoberat templatmi aj ked ich syntax je dost divoka...