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.


  • Mod

    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 *" ist
    

    Die 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)


  • Mod

    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 *" ist
    

    Im 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


Anmelden zum Antworten