Beispiel: Template Metaprogrammierung

Für nicht C++ Programmierer:

  • Templates sind Instrumente der generischen Programmierung.
  • Templates werden in C++ hauptsächlich für die Generierung typsicherer Container verwendet.
  • Templates sind keine Funktionen. Templates werden instanziert, nicht initialisiert.
  • Die (Template) Instanzierung findet grundsätzlich zur Compilezeit und nicht zur Laufzeit statt.

In [1]:
#include <iostream>
using namespace std;



  • Das Template Fakultaet instanziert sich rekursiv selbst:

In [2]:
template <int N> struct Fakultaet{
    static int const value= N * Fakultaet<N-1>::value;
};



  • Der Spezialfall Fakultaet<1> beendet die rekursive Instanzierung:

In [3]:
template <> struct Fakultaet<1>{
    static int const value = 1;
};



  • Das korrekte Ergebnis wird ausgegeben, obwohl ausser main() keine andere Funktion ausgeführt (initialisiert) wird.
  • Das funktioniert, weil das "Ergebnis" bereits zur Compilezeit durch instanzierung und nicht erst bei der Ausführung durch initialisierung berechnet wird:

In [4]:
int main(void) 
{
    cout << Fakultaet<5>::value << endl;
    return 0;
}


120
  • Der erzeugte Maschinencode enthält keinerlei Berechnungen mehr. Es wird nur noch eine Konstante ausgegeben.

In [ ]: