Template
Lo scopo dei template è quello di permettere di scrivere il codice
una sola volta e di utilizzarlo molte volte, in quei casi in cui si vuole
lavorare con tipi in qualche modo parametrizzati. Per esempio, supponiamo
che tu abbia bisogno di array di int, float o oggetti. Basta che tu scriva
una classe Array ed usi in essa un tipo non-determinato.
La sintassi è un po' complessa, ma i risultati hanno molto effetto:
// Dichiara la classe
template <int N, class A>
class Array
{
A *array;
public:
Array();
~Array();
A& operator[] (int i);
};
// Dichiara il costruttore
template <int N, class A>
Array <N, A>::Array()
{
array = new A[N];
}
// Dichiara il distruttore
template <int N, class A>
Array <N, A>::~Array()
{
delete [] array;
}
// Dichiara la funzione membro
template <int N, class A>
A &Array <N, A>::operator[] (int i)
{
return array[i];
}
class ExampleClass
{
public:
int a;
};
int main (int, char **)
{
Array <5, float> real_vector;
Array <200, char> string;
Array <10, ExampleClass> object_vector;
int i;
for (i = 0; i < 5; i++) real_vector[i] = 1.0;
for (i = 0; i < 200; i++) string[i] = 'A';
for (i = 0; i < 10; i++) object_vector[i].a = 0;
return 0;
}
Ogni volta che dichiari un oggetto da una classe template, tutto il codice scritto
(comprese le funzioni membro) deve esserci compilato nello stesso file prima della
della dichiarazione dell'oggetto.
Inoltre i template sono spesso usati per piccole funzioni generiche, quindi sono spesso
dichiarati come funzioni inline:
template <int N, class A>
class Array
{
A *array;
public:
Array() { array = new A[N]; }
~Array() { delete [] array; }
A& operator[] (int i) { return array[i]; }
};
questa è una definizione oltre che più semplice, più efficiente
della stessa classe Array vista prima.