K
pumuckl schrieb:
Nein, genau andersrum. Ganz im Gegensatz zu den Java Generics, die einmalig und sofort für alle Typen die rein können sollen compiliert werden, werden C++-Templates erstmal garnicht instantiiert, sondern erst dann, wenn sie benutzt werden, und dann auch nur für den einen Typ, mit dem sie benutzt werden. Und erst dann wird geprüft, ob der Code im Template überhaupt mit dem entsprechenden Typ compilierbar ist, d.h. ob die entsprechenden Operationen vorhanden sind.
Das ist auch der Grund warum man conventionen wie Traits, Concepts u.ä. hat.
Templates sind wie ziemlich dumme schablonen:
Es ist dem Compiler völlig egal ob der operator== oder der operator< überhaupt das tut was man von ihm will. Solange der Typ in die Schablone passt, sprich diese beiden Operatoren interstützt, wird der code compilieren.
template<class Zahl>
Zahl add(Zahl& a, Zahl& b)
{
return a+=b;
}
add wird für alles generiert was den operator+(T) definiert, völlig egal was es ist. std::string z.b. definiert diesen Operator auch!
D.h. ich kann hier statt einem Zahlentyp auch schreiben:
int a, b;
add("a", "b") ///!!!
std::cout << add(a=1,b=2) << add(std::string("a"), std::string("b")).c_str() << std::endl;
(ich weis das += mutet komisch an, aber mit nur a+b hat der compi gemeckert und ich wollt mich mit ihm grad nicht auseinandersetzen)
Sieh dir vielleicht mal das hier an (Punkt Concepts):
http://www.sgi.com/tech/stl/stl_introduction.html