S
Hi muhi,
sorry, wenn das jetzt hart klingt, aber ich habe den Eindruck, dass Du den Sinn von templates noch nicht verstanden hast (falls doch, darfst Du gerne mein Post hier abbrechen).
templates sind dafür da, Dinge, die man für unterschiedliche Typen machen möchte, nur einmal definieren zu müssen. Da man bei der implementierung des templates aber trotzdem hier und da den Typen benennen muß, führt man eben einen entsprechenden Bezeichner ein, der hier nicht eine Variable, sondern einen Typen bezeichnet (also nicht "laenge", sondern "int").
Minibeispiel: Ich brauche (warum auch immer) eine Art "doppelter Addition" für integer und strings. Eigentlich brauche ich dafür zwei Methoden:
int doppeltAddieren(const int& a, const int& b) {
int ergebnis = a + b + b;
return ergebnis;
}
std::string doppeltAddieren(const std::string& a, const std::string& b) {
std::string ergebnis = a + b + b;
return ergebnis;
}
... und wenn ich das nochmal für doubles brauche, schreibe ich das nochmal und für jeden anderen Typen jeweils nochmal.
Mit template schreibe ich dagegen nur einmal:
template <typename T>
T doppeltAddieren(const T& a, const T& b) {
T ergebnis = a + b + b;
return ergebnis;
}
... und bin fertig für alle Typen (die einen operator+() haben) !
Syntaktisch muß ich aber den Typ benennen (für den Rückgabetypen und die lokale Variable) ... also brauche ich dafür einen Namen und dafür nehme ich eben "T" (könnte auch "Simon2", "muhi" oder irgendetwas Anderes nehmen).
Syntaktisch braucht man das "typename", weil man templates auch mit konkreten Typen (z.B. int) definieren kann:
template <typename T, int V>
T doppeltAddieren(const T& a, const T& b) {
T ergebnis = a + b + V;
return ergebnis;
}
(ist allerdings etwas seltener zu gebrauchen).
Gruß,
Simon2.