Fragen zu "Template"

Drachton

Vice Admiral
Registriert
Nov. 2006
Beiträge
6.738
Hallo Forum,
ch les mich gerade in Template-Nutzung bei C++ ein, versteh aber nicht wirklich den Unterschied zwischen Funktions- und Klassentemplate?! Könnte mir das mal jemand erklären? Der Wikipedia-Text ist nicht wirklich hilfreich. So wie ich das jetzt verstehe, kann ich das Funktionstemplate als Funktionsersatz benutzen, also indem ich eine Rechnung integriere, die beim Abruf dieses Templates benutzt wird? Das Klassentemplate kann ich benutzen um beispielsweise nach einer bestimmten Variablen-(klasse) zu suchen ... bsp "int"?

Lieg ich damit richtig?
Was ist mit Spezialisierung des Klassentemplates gemeint?

Vielen Dank und Gruß
Drachton *der aufm Schlauch steht*

**push** wäre wichtig :(
 
Zuletzt bearbeitet:
Hallo,

eigentlich sagen die Namen ja schon alles: Ein Funktionstemplate ist einfach eine "Vorlage" einer Funktion, aus der der Compiler dann je nach Typ der übergebenen Argumente automatisch eine passende Spezialisierung generiert:
Code:
template <typename T> 
const T max(const T& a, const T& b)
{
    return(a > b ? a : b);
}
Das wäre mal ein Beispiel für ein Funktionstemplate. Der Typ T ist hier nicht festgelegt und daher kannst du später die Funktion z.B. mit float-Werten oder mit int-Werten aufrufen, ohne für jeden Parametertyp eine eigene Version erstellen zu müssen.

Bei einem Klassentemplate hast du stattdessen halt eine ganze Klasse. Das Prinzip bleibt insofern aber gleich, als du vor der Definition mit dem Schlüsselwort "typename" beliebig viele, noch nicht "festgelegte" Typen definieren und diese dann in der Funktion oder eben Klasse verwenden kannst.

Im Unterschied zu den Funktionstemplates musst du aber bei der Erstellung eines Objektes der Klasse den gewünschten Datentyp angeben:
Code:
std::vector[B]<int>[/B] myVector;
Dadurch wird eine Instanz der Templateklasse Vector erstellt und dabei das T durch int ersetzt.
Beim Aufruf der oben genannten Beispielfunktion kann der Compiler hingegen anhand der Argumente, die du der Funktion übergibst, selbst eine passende Version generieren. Ein solcher Aufruf würde also reichen:
Code:
int a = 3, b = 4;
float c = 3.3f, d = 4.4f;

[B]max(a, b);
max(c, d);[/B]
Einmal wird die Funktion mit int- und einmal mit float-Werten aufgerufen. Du kannst allerdings auch hier explizit angeben, welche Version du aufrufen möchtest:
Code:
float c = 3.3f, d = 4.4f;

max<int>(c, d);
In diesem Fall zwingst du den Compiler, eine int-Version der Funktion zu erstellen. Daher müssen die float-Werte durch eine Typkonvertierung umgewandelt werden.

Bei Unklarheiten bitte nachfragen. Die Templates sind eins der mächtigsten Themen in C++ und ich möchte von mir auch nicht behaupten, dass ich sie komplett beherrsche ;)

ph4nt0m
 
hey dank dir für den Beitrag phantom ;)
hat mich auf jeden Fall nun weiter gebracht. Hab schon gemerkt, das Templates nen großes Thema in C++ sind :)
 
Zurück
Oben