"typenloses" Template?



  • Hallo,

    ich habe mich schon öfters gefragt, wie das genau funktioniert.
    Man kennt es von std::find : man kann einfach einen begin und end eingeben, 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!


  • Mod

    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.


Anmelden zum Antworten