"typenloses" Template?
-
Hallo,
ich habe mich schon öfters gefragt, wie das genau funktioniert.
Man kennt es vonstd::find: man kann einfach einenbeginundendeingeben, und das mit nahezu jedem Iteratortypen, ohne ein Templatetyp in<>anzugeben.Wie funktioniert das? Warum muss kein Typ angegeben werden? Woher kennt die Funktion dann später die Größe eines Elementes des Vektors?
Wie heißt das, damit ich danach Googlen kann?Siehe auch: http://www.c-plusplus.net/forum/viewtopic.php?p=2275319#2275372
Vielen Dank!
-
template argument deduction.
Da der Compiler den Typ der Funktionsargumente sowieso schon kennt, kann er schließlich auch genau diesen Typ automatisch als Argument für das Template benutzen. Im Prinzip funktioniert alles recht intuitiv, erst wenn du tief in die Sonderregeln eintauchst (und wehe, du bringst auch noch Überladungen ins Spiel!) wird es kompliziert.
Man sollte auch aufpassen, dass die Typen eindeutig sind, was für Anfänger manchmal verwirrend ist, wenn Typen ins Spiel kommen, die sie in anderen Zusammenhängen als kompatibel kennen:
template <typename T> void foo(T, T) {} int main() { int i = 0; unsigned u = i; // eigentlich sind int und unsigned direkt ineinander umwandelbar foo(0, u); // Fehler: Was nun, int oder unsigned int? foo(0U, u); // So ist klar, unsigned ist gemeint foo<int>(0, u); // Man kann auch so schreiben, dass man int möchte }P.S.: In C++11 gibt es mit auto und decltype ähnliche Mechanismen nicht nur auf Templateargumente beschränkt.
-
Perfekt. Danke!
Habe es durch das Stichwort noch mal in der C++-FAQ nachlesen können.