Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Haben Templates Nachteile?
BLUESCREEN3D
25-03-2006, 17:17
Haben Templates (im Zusammenhang mit Funktionen) irgendwelche Nachteile, die man beachten muss?
Wenn ich beispielsweise eine Funktionen square() für zwei verschiedene Datentypen brauche, ist es dann eine gute Idee, diese mittels eines Templates zu realisieren, obwohl eigentlich nur zwei Datentypen benötigt werden?
Eine Möglichkeit, eine Template-Funktion nur für bestimmte Datentypen ("dieses Template ist nur für int und unsigned int") zu schreiben ist wohl nicht möglich, oder?
Wäre es allgemein empfehlenswert, zu überladenen Operator-Funktionen einer Klasse noch welche mit Template hinzuzufügen, damit beliebige Datentypen berücksichtigt sind?
Haben Templates (im Zusammenhang mit Funktionen) irgendwelche Nachteile, die man beachten muss?Für jeden Typ den du als Templateparameter einsetzt wird eigener Code generiert. Also hast du list<int> und list<double> so ist in deiner Binarie Code für 2 Listenklassen drinn. Aber das ist net weiter schlimm, denn wie willst das sonst (gescheit!) machen?
Ander Nachteile:
Eine template Methode kann nicht virtual sein!
Templates müssen ganz im Header implementiert werden.
Bie Template Compilererrors ists manchmal der Horror rauszufinden was jetzt eigentlich falsch ist.
Wenn ich beispielsweise eine Funktionen square() für zwei verschiedene Datentypen brauche, ist es dann eine gute Idee, diese mittels eines Templates zu realisieren, obwohl eigentlich nur zwei Datentypen benötigt werden?Das ist oft geschmakssache, aber hier finde ich ein Template schon gut. Man kann ja templates auch speziellisieren, so das du eine optimierte Variante für einen speziellen Typ anbieten kannst.
// allgem. templ. funktion
template< typename T >
T foo(T x) {
// ...
return x;
}
// und nun die spezialisierung
template<>
int foo<int>(int x) {
// ...
return x;
}
Eine Möglichkeit, eine Template-Funktion nur für bestimmte Datentypen ("dieses Template ist nur für int und unsigned int") zu schreiben ist wohl nicht möglich, oder?Doch. So wie im Code gezeigt ohne der 1. Funktion. Aber worinliegt der Sinn?
Wäre es allgemein empfehlenswert, zu überladenen Operator-Funktionen einer Klasse noch welche mit Template hinzuzufügen, damit beliebige Datentypen berücksichtigt sind?Kommt auf den speziellen Fall drauf an. Aber wie willst du mit Typen, die du nicht kennst umgehn? Naja, wenn du annimmst das es Numerische Typen sind, dann eventuell. Dann wird dein Compiler eben schreien wenn du einen nicht Kompatieblen Typen übergibst.
BLUESCREEN3D
25-03-2006, 18:48
// und nun die spezialisierung
template<>
int foo<int>(int x)
Ich habe die Spezialisierung immer so geschrieben:
int foo(int x)
Gibt es da einen Unterschied?
Eine Möglichkeit, eine Template-Funktion nur für bestimmte Datentypen ("dieses Template ist nur für int und unsigned int") zu schreiben ist wohl nicht möglich, oder?
Doch. So wie im Code gezeigt ohne der 1. Funktion.
Ich meinte das eher im Sinne von "eine Spezialisierung, die mehrere Datentypen abdeckt". Nach dein Beispiel braucht man ja eine Spezialisierung pro Datentyp.
locus vivendi
25-03-2006, 19:40
Ich habe die Spezialisierung immer so geschrieben:
Code:
int foo(int x)
Gibt es da einen Unterschied?
Der Unterschied ist, dass dies gar keine Spezialisierung ist :-) Es handelt sich einfach um überladen.
Ich meinte das eher im Sinne von "eine Spezialisierung, die mehrere Datentypen abdeckt". Nach dein Beispiel braucht man ja eine Spezialisierung pro Datentyp.
Funktionstemplates kann man leider nur vollständig spezialisieren, aber das wird sich möglicherweise mit der nächsten Ausgabe des Standards ändern.
BLUESCREEN3D
25-03-2006, 20:14
Der Unterschied ist, dass dies gar keine Spezialisierung ist :-) Es handelt sich einfach um überladen.
Natürlich, aber ich meinte, ob es im Endeffekt einen Unterschied macht und ob damit eine der beiden Varianten zu bevorzugen ist :D
Die template-Variante ist zu bevorzugen. Wenn du spezialiseren willst, solltest du das auch tun, und nicht ein anderes Feature nehmen, das zufällig zum selben Ergebnis führt.
Eine template Methode kann nicht virtual sein!
Was genau meinst du damit ?
Was ist eine template methode ?
wenn du eine Methode an einem Objekt meinst, die selber noch mal nen template ist, hasst du sicher recht (macht man eh seltener, und manche compiler machen eh nur probleme draus), aber nen object als template mit normalen methoden kann sowohl virtuelle methoden deklarieren als auch definieren.
Und ne (template)function die nich an nem objekt haengt muss eh nicht virtual sein koennen.
Das ist oft geschmakssache, aber hier finde ich ein Template schon gut.
Templates sind oft der einzige weg, code general wiederverwendbar zu machen, und dabei performant zu bleiben.
Es gibt meisten 1000 möglichkeiten ein template zu umgehen, aber wenn das template ned grad grausam programmiert war, ist das template meist immer die schnellste und unkomplizierste Variante (wenn man damit umgehen kann ^^).
Wäre es allgemein empfehlenswert, zu überladenen Operator-Funktionen einer Klasse noch welche mit Template hinzuzufügen, damit beliebige Datentypen berücksichtigt sind?
Kommt ganz drauf an was du machen willst ....
Bedenke, das eine template funktion sich fuer jeden typ eine version "generiert", du also an der stelle jegliche Typsicherheit quasi ausschaltest. Wenn die funktion/methode also mit wirklich jeden typ funktionieren soll, ist das ok ... wenn nicht, iss bisserl mehr kreativitat gefragt ^^
Ciao ...
Den einzigen wirklichen Nachteil von templates sehe in darin, dass u.U. die Fehlermeldungen mehr oder weniger Datenmüll werden können; insbesondere, wenn du die STL ausgiebig nutzt.
Bei einem C++ Programm, welches exzessiven Gebrauch von Templates macht, hatte ich es schonmal, dass ein einziger Fehler eine Ausgabe von 120 Zeilen Fehlercode produzierte.
Und natürlich kann man mit templates auch Berechnungen zur Compilierzeit durchführen
#include <iostream>
template<int N> struct fact
{
enum {value=N * fact<N-1>::value};
};
template<> struct fact<0>
{
enum {value = 1};
};
int main()
{
std::cout << "10! = " << fact<10>::value << std::endl;
}Dieses Programm führt keinerlei Berechnungen zur Laufzeit aus.
Da gabs doch mal den Wettbewerb in der Ct, wo son Problem mitm Wuerfel durch backtracking geloest werden sollte.
absolut schnellste version war halt auch einer, der das mit compilerarithmetik rauscompiliert hat ^^ laufzeit halt das was er zur ausgabe der ergebnisse brauchte ^^
Wurde aber nicht gewertet, weil die eingabe-parameter logischerweisse nicht als variablen vorgelegen haben ... und die laufzeit ja nun so nich gemessen werden kann ^^
Ciao ...
IIRC hatte er auch nur ein proof-of-concept mit einem vereinfachten Problem vorgelegt, da die Compilierzeit beim echten Problem nicht mehr erlebbar war ;)
BTW: Für Freunde der Template-Metaprogrammierung: (ich bin keiner ;))
http://www.boost.org/libs/mpl/doc/index.html
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.