Frage zu Templates
-
Hi,
ich habe mal eine Frage zur Spezialisierung von Funktiontemplates.template <class Object> void Print(Object &o); template<> void Print<std::string>(std::string &o);Ist es möglich das man statt Printstd::string nur Print schreiben muss? Sonst muss ich alles doppelt angeben, also einmal in den <>'s und dann nochmal in der Argumentliste.
-
pyhax schrieb:
Hi,
ich habe mal eine Frage zur Spezialisierung von Funktiontemplates.template <class Object> void Print(Object &o); template<> void Print<std::string>(std::string &o);Ist es möglich das man statt Printstd::string nur Print schreiben muss? Sonst muss ich alles doppelt angeben, also einmal in den <>'s und dann nochmal in der Argumentliste.
ja.
-
Habe ich auch gerade mitbekommen. Komisch, eigentlich dachte ich, ich hätte es schonmal probiert und es hat nicht geklappt.
-
ja und nein...
In der Deklaration und Defintion MUSS es sowohl in der Template-Argument-Liste als auch in der Liste der Funktionsparameter stehen:KORREKTUR: Du kannst es an besagter Stelle doch weglassen

Folgendes bleibt trotzdem zu beachten:Beim Aufrufen der Funktion kannst du aber die Template-Argumente weglassen, sofern der Compiler diese selbst herleiten kann.
std::string msg = "hello world"; Print(msg); // entspricht Print<std::string>("hello world"); // aber nicht Print("hello world"); // da hier der Typ nicht "std::string" sonder "const char *" istDie explizite Angabe ist beim Aufruf nur erforderlich, wenn:
1. das Argument nicht eindeutig ermittelt werden kann (mir fällt gerade nichts konkretes als Beispiel ein xD)
2. das Argument gar nicht ermittelt werden kann (z.B. das Argument betrifft nur den Rückgabetyp, diesen kann der Compiler nicht herleiten)
3. man gezielt eine andere Sezialisierung nutzen möchte, als die, die der Compiler selbstständig nutzen würde (siehe Codebeispiel oben)
-
Noch eine Frage: Ist es egal ob ich Print<> oder nur Print schreibe? (GCC gibt mir keine Warnung, scheint also ok zu sein)
-
pyhax schrieb:
Noch eine Frage: Ist es egal ob ich Print<> oder nur Print schreibe? (GCC gibt mir keine Warnung, scheint also ok zu sein)
ja.
DrakoXP schrieb:
std::string msg = "hello world"; Print(msg); // entspricht Print<std::string>("hello world"); // aber nicht Print("hello world"); // da hier der Typ nicht "std::string" sonder "const char *" istIm dritten Fall ist Object = const char[12], da es sich um einen Referenzparameter handelt.
Zu beachten ist, dass Definitionen expliziter Funktionstemplatespezialisierungen keine Templatedefinitionen sondern Funktionsdefinitionen sind, folglich ist die ODR entsprechend zu beachten und die Funktion ggf. inline zu deklarieren.
-
Spricht etwas dagegen, die Funktion zu überladen?
-
wxSkip schrieb:
Spricht etwas dagegen, die Funktion zu überladen?
Oops, manchmal sieht man den Wald vor lauter Bäumen nicht

ch habe das ein paar mal in meinem Code (nicht für Print, aber so ähnlich):
template <class T> void Print(const T &) { static_assert(sizeof(T) == 0, "Print is not available for this type. "); } template <> void Print(const std::string & s) { //... } //Noch mehr Spezialisierungen
Danke