Erster Schritt der Generifizierung: C++ Templates erlauben Typ-Parametrisierungen

Warum double?

Versuchen wir jetzt unser sum0 zu benutzen, können wir schnell in Probleme laufen:

double a[10];
float  b[10];
// ...
double sa = sum0(a, 10); // OK
float  sb = sum0(b, 10); // Kompilier-Fehler

Leider funktioniert sum0 nur mit double, aber nicht mit float. Für diese Einschränkung gibt es keinen substantiellen Grund — außer dass wir bei einer normalen C++-Funktion eben einen festen Typ für jedes Argument angeben müssen.

Typ-Parameter

Wenn ein Argument-Typ jedoch selbst ein Parameter sein kann, dann läßt sich sum mit einem Schlag für alle Wertetypen des Eingabe-Arrays implementieren. Einen solchen Typ-Parameter kann man in C++ mit dem Template-Konstrukt angeben:

template<typename T>
T sum1(T* a, int n)
{
  T res = 0;
  for(int i = 0; i < n; ++i)
    res += a[i];
  return res;
}

Der Parameter T übernimmt jetzt die Rolle des vorher konstanten Typs double, und damit funktioniert unser obiger Aufruf:

double a[10];
float  b[10];
int    c[10];
// ...
double sa = sum1(a, 10); // OK
float  sb = sum1(b, 10); // OK
int    sc = sum1(c, 10); // OK

Wir können jetzt also Arrays von beliebigem Werte-Typ verarbeiten (int, std::complex<double>, myvector (sofern vernünftig geschrieben ...), und sogar std::string (naja, fast ... hierauf kommen wir nochmal zurück). Sind wir damit jetzt wunschlos glücklich?