Informatica 2 Liceo Scientifico Scienze Applicate/Template: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 103:
</source>
Teniamo presente però che nella specializzazione dobbiamo riscrivere l'intera classe. Non vi è alcuna derivazione dalle altre.
 
La specializzazione entra in gioco quando si parla di metaprogrammazione. Prima di C++11, dove non era presente il specifier <code>constexpr</code>, per realizzare certe funzioni che dovevano essere valutate a tempo di compilazione si doveva utilizzare i Template. Ad esempio proviamo a calcolare il fattoriale di un numero con i Template:
<source lang=cpp>
template <unsigned long long v>
struct Fattoriale
{
enum
{
value = Fattoriale<v - 1>::value * v
};
};
 
template <>
struct Fattoriale<0>
{
enum
{
value = 1
};
};
</source>
E si utilizza così
<source lang=cpp>
int main()
{
cout << Fattoriale<5>::value;
}
</source>
Beh, ora che possiamo avere calcoli così <i>deep</i> a costo zero in esecuzione verrebbe da usarli in questo modo
<source lang=cpp>
int main()
{
unsigned long long n;
cout << "Inserisci il numero di cui calcolare il fattoriale: ";
cin >> n;
cout << endl << Fattoriale<n>::value;
}
</source>
vero? Beh, no. I Template vengono appunto calcolati in compilazione, e non si conosce il valore di <code>n</code> in compilazione, ma in esecuzione. E no, non basta calcolare già la struttura di un numero molto grande per avere già risultati pronti.
 
La variante <code>constexpr</code> è invece molto flessibile ed è utilizzabile pure in contesti non costanti.
 
==Problemi con i Template==
I Template hanno dei problemi. Il primo è che niente vieta di chiamare una funzione che utilizza certi operatori o certe funzioni membro. Ad esempio chiamate del tipo