Questa tecnica che sto per illustrarvi si chiama metaprogrammazione e consiste nell'usare le strutture in modo particolare affinchè, usate come delle funzioni, si possano effettuare calcoli a compile-time (cioè vengono eseguiti dal  compilatore ed il risultato viene posto nell'eseguibile, e quindi precedentemente nei file oggetto). Questa tecnica è ampiamente utilizzate nelle STL del C++ e in diverse librerie.

Partiamo con un esempio(scusate se non è formattato con i tag code ma non ne voleva sapere di funzionare):

 

#include <iostream>
using namespace std;

template <int n>
struct Fibonacci
{
enum { val = Fibonacci<n-1>::val + Fibonacci<n-2>::val };
};

template<>
struct Fibonacci<1>
{
enum { val = 1 };
};

template<>
struct Fibonacci<0>
{
enum { val = 0 };
};

int main()
{
cout<<"Fibonacci(10) =  "<<Fibonacci<10>::val<<endl;
cin.get();
return 0;
}

 

Bene, come potete vedere la struct-template Fibonacci e le sue due specializzazioni  vengono usate per il calcolo dell'n-esimo numero nella sequenza di fibonacci. Per fare ciò, innanzitutto, bisogna conoscere i dati di input a compile-time, cioè i dati di  input devono essere delle costanti. Nella struct fibonacci viene usata una enum anonima e gli viene assegnato un valore che viene calcolato tramite una ricorsione(che funziona come una normalissima funzione). Le due specializzazioni Fibonacci<0> e Fibonacci<1> rappresentano i due casi base della ricorsione. Tutto questo meccanismo avviene quando viene istanziata la struct Fibonacci (Fibonacci<10>::val).

 Vi invito ad approfondire l'argomento il quale potrebbe risultarvi interessante.

 Alla prossima! Ciao :)