Funzioni template
Oltre a classi template e` possibile avere anche funzioni template,
utili quando si vuole definire solo un'operazione e non un tipo di dato, ad
esempio la libreria standard definisce la funzione min piu` o meno
in questo modo:
template < typename T >
T& min(T& A, T& B) {
return (A < B)? A : B;
}
Si noti che la definizione richiede implicitamente che sul tipo T
sia definito operator < . In questo modo e` possibile
calcolare il minimo tra due valori senza che sia definita una funzione min
specializzata:
int main(int, char* []) {
int A = 5;
int B = 10;
int C = min(A, B);
TMyClass D(/* ... */);
TMyClass E(/* ... */);
TMyClass F = min(D, E);
/* ... */
return 0;
}
Ogni qual volta il compilatore trova una chiamata alla funzione min
istanzia (se non era gia stato fatto prima) la funzione template (nel
caso delle funzioni l'istanziazione e` un processo totalmente automatico che
avviene quando il compilatore incontra una chiamata alla funzione template
producendo una nuova funzione ed effettuando una chiamata a tale istanza. In
sostanza con un template possiamo avere tutte le versioni overloaded della funzione
min che ci servono con un'unica definizione.
Si osservi che affinche la funzione possa essere correttamente istanziata, i
parametri del template devono essere utilizzati nella lista dei parametri formali
della funzione in quanto il compilatore istanzia le funzioni template sulla
base dei parametri attuali specificati al momento della chiamata:
template < typename T > void F1(T);
template < typename T > void F1(T*);
template < typename T > void F1(T&);
template < typename T > void F1(); // Errore
template < typename T, typename U > void F1(T, U);
template < typename T, typename U > int F1(T);// Errore
Questa restrizione non esiste per le classi template, perche` gli argomenti
del template vengono specificati esplicitamente ad ogni istanziazione.
|