Esempio pratico: Supponi di scrivere un'applicazione in cui hai bisogno di una classe "Punto" per contenere le coordinate di un pixel sullo schermo (magari per un programma tipo Paint), le cui coordinate, quindi, saranno *numeri interi*. La classe, presumibilmente, sarebbe
codice:
//file Punto.h
class Punto
{
public:
Punto(int x, int y); //costruttore
void Stampa(); //stampa il punto
(...altri metodi utili...)
private:
int x;
int y;
};
Supponi ora di voler scrivere un programma che debba modellare un piano cartesiano vero e proprio (che ne so, un programma di studio di funzioni o simile). Anche in questo caso avresti bisogno di un "Punto", ma le cui coordinate debbano essere *numeri decimali*, diciamo dei float. Se non esistessero i template, dovresti prendere il file "Punto.h" e riadattarlo, sostituendo tutti gli "int" con dei "float". Tutto il resto del codice resterebbe invariato.
I template ti permettono invece di definire, in questo caso, una classe Punto le cui coordinate sono di un tipo che... decidi tu. In codice, si avrebbe
codice:
//definizione classe
template<class TipoCoord>
class Punto
{
public:
Punto(TipoCoord x, TipoCoord y); //costruttore
void Stampa(); //stampa il punto
private:
TipoCoord x;
TipoCoord y;
};
//... nel codice in cui si usa...
Punto<int> p(3, 4); //punto con coordinate intere
Punto<float> p(3.5, 7.88); //punto con coordinate decimali
Un comodissimo esempio di uso dei template sono le classi contenitore STL, coms list, la lista. Se non esistessero i template, avresti listOfInt, listOfFloat, listOfString... tutte con codice quasi identico!
Cool, eh?