Template Meta Programmierung

In vielen Libraries wird heute Template Meta Programmierung (TMP) genutzt, um zur Compilezeit verschiedene Typen zu erzeugen. Mit TMP kann man Werte zur Compilezeit berechnen, dies ist nützlich wenn man konstanten berechnen muss, oder Mathematische Tabellen vorher berechnen will.

Man kann aber auch Compilefehler „berechnen“ lassen, damit ist es möglich einen Fehler der sonst erst zur Laufzeit aufkäme, im Compilierungsvorgang abzufangen.

TMP ist ein sehr großer Bereich, und da es turing complete ist, kann TMP auch sehr komplex werden, dies würde aber den Rahmen dieser Einführung sprengen, daher nur ein kurzes Beispiel, wie man die Fakultät einer Zahl berechnet:

 

template <unsigned n>
struct factorial
{
  enum { value = n * factorial<n-1>::value };
};
template <>
struct factorial<0>
{
  enum { value = 1 };
};
 

Hierbei wird erst das Template definiert, welches sich hierbei in der enum rekursiv selbst aufruft. Für n = 0 wird der Wert des Templates mit einer Templatespezialisierung festgelegt. So erfolgt die Berechnung der Fakultät zur Compilezeit rekursiv.