Tipi come parametri

Molti linguaggi orientati agli oggetti ammettono la possibilità di utilizzare i tipi come parametri (genericità). C++ supporta la genericità attraverso la nozione di template (modello).

I template permettono la realizzazione di classi “contenitrici” (liste, array associativi, …) in modo del tutto naturale e senza alcuna limitazione nell’attribuzione dei tipi statica, o nell’efficienza del codice prodotto.

Viene facilitata la creazione di funzioni “generiche” (ad es. sort), da definire una volta per tutte a prescindere dal tipo degli oggetti.

Template

Un template specifica come costruire classi distinte allo stesso modo in cui una classe fornisce la specifica per la creazione di oggetti.

L’esempio più naturale che illustra questo concetto è rappresentato da una classe “contenitore”, ossia una classe che è in grado di contenere oggetti di un qualche altro tipo. Il tipo dell’oggetto contenuto deve essere un parametro della classe contenitore.

La specifica di una classe template viene definita in funzione del parametro: è l’utente che stabilisce poi il tipo dell’oggetto contenuto per ciascun particolare “contenitore”, specificando un tipo specifico al momento della creazione del contenitore.

Una classe template è una classe che dichiara un tipo come parametro.

Esempio:

Uno stack in grado di contenere oggetti di tipo T viene così definito

template <class T> class Stack {
  T* v, p;
  int sz;
  public:
    Stack(int s) {
      v = p = new T[sz = s];
    }
    ~Stack() {
      delete[] v;
    }
  void push(T a) {
    *p++ = a;
  }
  T pop(void) {
    return * --p;
  }
  int size(void) const {
    return p - v;
  }
};

Il prefisso template<class T> indica che si sta dichiarando un template e che un argomento di tipo T verrà usato nella dichiarazione.

Nota: template<class T> indica che T è il nome di un tipo, non necessariamente il nome di una classe.

Nel momento in cui si vuole utilizzare una classe template basta indicare il tipo attuale, ad esempio

Stack<char> sc(100);// stack di caratteri

definisce un oggetto sc di una classe Stack<char>.

Funzioni Template

Così come una classe template definisce una famiglia di classi, una funzione template definisce una famiglia di funzioni.