Predloge (templates)
Recimo, da želimo napisati funkcijo max, ki sprejme dve vrednosti in vrne
večjo izmed obeh.
Za števila bi jo napisali recimo tako:
int max(int x, int y) {
if (x > y) {
return x;
} else {
return y;
}
}
Zelo podobna bi bila funkcija za double:
double max(double x, double y) {
if (x > y) {
return x;
} else {
return y;
}
}
Če bi jo želeli napisati za kater drug tip, bi prav tako izgledala zelo
podobno. Da se izognemo temu nepotrebnemu ponavaljanju kode, lahko napišemo eno
samo funkcijo, ki deluje za splošen tip T. Zapišemo jo tako:
template <typename T>
T max(T x, T y) {
if (x > y) {
return x;
} else {
return y;
}
}
Beseda template pred funkcijo označuje, da je ta funkcija predloga, zvevza
typename T, pa pomeni, da T označuje naš neznani tip. Namesto besedice
typename lahko uporabimo tudi class. Ko funkcijo
pokličemo z npr. max(1.2, 4.5), prevajalnik sam ve, da smo jo poklicali z
dvema parametroma tipa double in v predlogo vstavi namesto T tip double
ter dobi funkcijo, kot smo jo napisali prej.
Če pa bi npr. želeli funkcijo poklicati kot max(3, 1.2), torej s
parametroma int in double, pa se koda ne bi prevedla, saj morata biti v
predlogi oba tipa enaka (oba sta T).
a.cpp:16:23: error: no matching function for call to ‘max(int, double)’
cout << max(3, 1.2) << endl;
^
a.cpp:7:3: note: candidate: template<class T> T max(T, T)
T max(T x, T y) {
^~~
a.cpp:7:3: note: template argument deduction/substitution failed:
a.cpp:16:23: note: deduced conflicting types for parameter ‘T’ (‘int’ and ‘double’)
cout << max(3, 1.2) << endl;
^
TODO: Funckije s poljubno argumenti, templated classes.