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.