PDA

View Full Version : [C++] Template Metaprogramming


biowep
20-10-2014, 18:57
Salve,
ho dei dubbi riguardo la metaprogrammazione.
Prendiamo ad esempio questo codice, che non sono sicuro al 100% sia metaprogrammazione (perché l'ho modificato usando del codice trovato)
#include <iostream>
using namespace std;

template<int i>
class FACT {
public:
static int EXEC() {
return i * FACT<i - 1>::EXEC();
}
};

template<>
class FACT<0> {
public:
static int EXEC() {
return 1;
}
};

int main(void) {
cout << FACT<3>::EXEC();
}
Io dichiaro una funzione EXEC in una classe template ed una funzione omonima nella stessa famiglia di classi template specializzata con il valore 0.

Volevo sapere come funziona esattamente.
In particolare: so che le istruzioni metaprogrammate vengono eseguite a compile time, ma questo significa che posso usare qualsiasi istruzione? Ad esempio il return, che valore ha se eseguito a compile time, ha lo stesso effetto?
Nell'esempio, quale è l'esatto codice che si ottiene nel main una volta analizzato il metaprogramma?
La dichiarazione template<int i>, non dovrebbe essere una specializzazione di un template esistente? Cioè dichiarare prima un template<typename T> con del codice generico e poi quello con del codice speciale?
Perché non posso testare direttamente nella funzione della classe template il valore di i.
if (i>0);

AnonimoVeneziano
23-10-2014, 00:25
In soldoni il codice in questione viene tradotto così' :


class FACT_0 {
public:
static int EXEC() {
return 1;
}
};

class FACT_1 {
public:
static int EXEC() {
return 1 * FACT_0::EXEC();
}
};

class FACT_2 {
public:
static int EXEC() {
return 2 * FACT_1::EXEC();
}
};

class FACT_3 {
public:
static int EXEC() {
return 3 * FACT_2::EXEC();
}
};

int main() {
cout << FACT_3::EXEC();
}


Devi pensare alla meta programmazione come a una macro più' potente e typesafe.

Il codice viene generato in fase di compilazione e poi compilato normalmente, ma questo internamente al compilatore, senza alcun preprocessore in mezzo come per le macro in C.

Una volta che quel codice che ho postato di sopra viene mandato al code-generator probabilmente verra' ottimizzato dagli inliner in :


int main() {
cout << 6;
}


Non hai la certezza che pero' questo avvenga purtroppo :)

Ciao