
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?