Funktions-Templates

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Funktions-Templates (Übersicht) - Index

Sehen wir uns die Funktion max(x, y) an, die das größere der beiden Argumente zurückgibt. x und y können von einem beliebigen, sortierbaren Typ sein. Da C++ eine streng auf Typen ausgerichtete Sprache ist, müssen die Argumenttypen zum Zeitpunkt der Compilierung deklariert werden. Ohne Templates sind viele überladene Versionen von max erforderlich, d.h., eine Version für jeden unterstützten Datentyp, obwohl der Programmcode im Prinzip für jede Version identisch ist. Jede Version vergleicht die Argumente miteinander und gibt das größere zurück.

Um dieses Problem zu umgehen, kann man z.B. ein Makro verwenden:



 #define max(x,y) ((x > y) ? x : y)



Die Verwendung von #define umgeht jedoch die Typüberprüfung, die ein wesentlicher Vorteil von C++ gegenüber C ist. Der Einsatz von Makros ist in C++ nahezu überflüssig. Die Aufgabe von max(x, y) liegt im Vergleichen kompatibler Typen. Das Makro seinerseits erlaubt jedoch leider auch einen Vergleich von int und struct Typen, die nicht kompatibel sind.

Ein weiteres Problem bei der Verwendung des Makros liegt darin, dass eine Substitution ausgeführt wird, wo dies gar nicht erwünscht ist. Wenn Sie statt dessen ein Template verwenden, können Sie eine Maske für gleichartige überladene Funktionen definieren, indem Sie den Datentyp selbst als Parameter verwenden:



 template <class T> T max(T x, T y){
    return (x > y) ? x : y;
    };



Der Datentyp wird durch das Template-Argument <class T> repräsentiert. Beim Einsatz in einer Anwendung generiert der Compiler den geeigneten Code für die max Funktion gemäß dem im Aufruf tatsächlich verwendeten Datentyp:



 int i;
 Myclass a, b;
 int j = max(i,0);       // Integer-Argumente
 Myclass m = max(a,b);   // Argumente vom Typ Myclass



Für <class T> kann jeder beliebige Datentyp (nicht nur Klassen) verwendet werden. Der Compiler ruft dann den entsprechenden operator>() auf, so dass Sie max mit Argumenten jedes beliebigen Typs einsetzen können, für den der operator>() definiert ist.

Siehe auch