Unterschied zwischen Template und Funktion?



  • Hey C++ Com!
    Wie schon im Titel steht, frage ich mich, was der Unterschied zwischen einem Template, und einer Funktion ist?
    Kann mir jemand die Frage beantworten?



  • Kauf dir ein gutes Grundlagenbuch.

    template <class T>
    T add(t a, T B)
    {
        return a+b;
    }
    

    Das ist ein template UND eine Funktion.



  • Marthog schrieb:

    Das ist ein template UND eine Funktion.

    Ein Funktionstemplate ist keine Funktion 😡
    Oder kann man von ihm eine Adresse nehmen?



  • Gut sagen wir es so. Das ist ein template und

    foo<int>
    

    ist dann die Funktion.



  • Das mit nem t a, t b kann ich auch über Funktionen machen, half nicht wirklich ô.o



  • Shortyoo schrieb:

    Das mit nem t a, t b kann ich auch über Funktionen machen, half nicht wirklich ô.o

    Ach, wirklich? Meine add(T a, T b) kann ich für jeden Typ verwenden. Es geht für integer, float, aber auch zum Verknüpfen von strings oder zum Addieren von vector3df aus Irrlicht. Das wirst du mit Funktionen niemals alles alleine schreiben können.



  • Was bringt denn

    T add(t a, t b)
    

    Ist es nicht das gleiche wie:

    int Funktion(int a, int b){
    return a+b
    }
    

    😕



  • Nein, es ist nicht das gleiche. Mit

    int Funktion(int a, int b){
    return a+b
    }
    

    kannst du nur ints addieren.

    Wenn du die Funktion als Template definierst kann du beliebige Objekte und Primitive Types übergeben, die den + Operator unterstützen. Als kleines Beispiel (ungetestet, habe das nur schnell hingeschrieben):

    struct Point
    {
        int x, y;
        Point(int a, int b) : x(a), y(b) { }
    
        Point operator+(const Point &p)
        {
            return {x + p.x, y + p.y};
        }
    
        friend std::ostream &operator<<(std::ostream &os, const Point &p)
        {
            os << "(" << p.x << "," << p.y << ")";
            return os;
        }
    };
    
    template <typename T>
    T add(T a, T b)
    {
        return a + b;
    }
    
    int main()
    {
        std::cout << add(3, 4) << std::endl; 
        std::cout << add(4.2, 4.8) << std::endl; 
    
        std::string s1("Hello");
        std::string s2(" world");
        std::cout << add(s1, s2) << std::endl;
    
        Point p1(3, 8);
        Point p2(4, 9);
        std::cout << add(p1, p2) << std::endl;
    }
    

    Versuch das mal mit deiner Definition. Wird nicht klappen 😉



  • Ah, ein Template ist nur dafür da, um nicht endlich viele Funktionen zu machen?
    Beispielsweise bräuchte ich eine Funktion für: float, int, char ...
    Und so brauche ich nur eine für Template? ( Wenn immer a+b als return angegeben ist, wie in dem Beispiel)

    Edit:
    Und sonst gibt es keinen Unterschied?



  • Shortyoo schrieb:

    Ah, ein Template ist nur dafür da, um nicht endlich viele Funktionen zu machen?
    Beispielsweise bräuchte ich eine Funktion für: float, int, char ...
    Und so brauche ich nur eine für Template? ( Wenn immer a+b als return angegeben ist, wie in dem Beispiel)

    Ja.
    Alles, wo die Expression T() + T() gültig ist, sprich ein operator+ verfügbar kann damit verwendet werden.

    Edit:
    Und sonst gibt es keinen Unterschied?

    Reicht das nicht?
    Es gibt schon noch feine wie bpsw. dass das Template im Header definiert weren muss u.ä.


  • Mod

    Es ist wohl auch noch erwähnenswert, dass man nicht nur Templates für Funktionen machen kann, sondern für ganze Klassen.

    Ansonsten: Template = Englisch für Vorlage/Bauplan
    Das dürfte wohl die meisten Fragen beantworten, was man sich unter Templates vorstellen sollte, sofern das dem TE bis jetzt noch nicht bekannt war.


  • Mod

    Es ist wohl auch noch erwähnenswert, dass man nicht nur Templates für Funktionen machen kann, sondern für ganze Klassen.

    ... und für Variablen und für Typedefs (bzw. Alias-Deklarationen). 🤡

    Es gibt schon noch feine wie bpsw. dass das Template im Header definiert weren muss u.ä.

    Nein, das muss es nicht. Da der Header im Source eingebunden wird, wird es sowieso im Source definiert. Feil nochmal an der Formulierung.



  • Arcoth schrieb:

    Es gibt schon noch feine wie bpsw. dass das Template im Header definiert weren muss u.ä.

    Nein, das muss es nicht. Da der Header im Source eingebunden wird, wird es sowieso im Source definiert. Feil nochmal an der Formulierung.

    ...dass die Definition eines Templates in jeder Sourcedatei in der es verwendet wird verfügbar sein muss. 🙄



  • Arcoth schrieb:

    Da der Header im Source eingebunden wird, wird es sowieso im Source definiert.

    Ach, Header ist kein Source?



  • Shortyoo schrieb:

    Ah, ein Template ist nur dafür da, um nicht endlich viele Funktionen zu machen?

    Sehr einfach gesprochen ja, aber Templates können noch einiges mehr (Neben den Klassentemplates sei hier nur der Ergänzung halber Templatemetaprogrammierung, Statische Codeprüfung... genannt).

    Es gibt nicht ohne Gründe mehr als ein Buch das sich ausschließlich mit Templates beschäftigt (u.a. C++ Templates: The Complete Guide, C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond, wobei letzteres in mindestens 90% der Fälle nicht praxisrelevant sein wird).


Log in to reply