Verwendung und erstellung von templates.



  • Ok danke 😃
    Ich hab es jetzt sowit verstanden , das ich jeztz wircklich unabhängie funktionen schreiben kann.

    Ich hab das mit dem

    template<typname T>
    

    so verstanden ,das T jeder type sein kann ?!

    Nun hab ich aber noch so was gesehen :

    template<class T>
    

    Was ist das denn ?



  • _D schrieb:

    Ok danke 😃
    Ich hab es jetzt sowit verstanden , das ich jeztz wircklich unabhängie funktionen schreiben kann.

    Ich hab das mit dem

    template<typname T>
    

    so verstanden ,das T jeder type sein kann ?!

    Nun hab ich aber noch so was gesehen :

    template<class T>
    

    Was ist das denn ?

    Erstens heißt es typename, zweitens ist da (in diesem Zusammenhang!) kein Unterschied.
    Lies das nochmal hier durch.

    Edit:
    Ahh, hab was vergessen. Bei template template Parametern muss es class heißen 😉

    Und noch was: Ja, T kann jeder Typ sein, mit ihm können dann aber auch nur(und auch nur überladene, wenns ne Klasse ist) Operatoren genutzt werden.



  • Also wie jetzt das ist kein unterschied aber Bei template template Parametern muss es class heißen.

    Tut mir leid , aber eine kleine erklärung oder Beispiel wären ganz schön



  • template<class eins,template<class> typename zwei>// Muss nicht typename sondern class
    class Foo
    {
    };
    

    Zwei definiert eine Klasse, also muss da class hin.

    template<class T>/// Scheißegal
    T bigger(T& a, T& b){
        return ((a>b)?a:b);
    }
    


  • _D schrieb:

    Also wie jetzt das ist kein unterschied aber Bei template template Parametern muss es class heißen.

    typename und class sind in diesem Zusammenhang gleichwertig. Warum es beides geht steht in dem Link von Hacker doch gut beschrieben.

    @Hacker
    Natürlich sind die operator << für Basistypen einzeln überladen. Oder willst du bei "char" lieber die dezimale Darstellung sehen? Was machst du mit void*? Oder mit Fließkommazahlen? Da sind überall unterschiedliche Verhaltensweisen gefordert.



  • Ahh jaaa 😃
    Dann

    cout << HW << endl;//endl ist ein Template
    

    Edit: Ja, cooky, bin schon ziemlich behindert. Erst vor 'ner Stunde sah ich noch das.



  • Muss dich enttäuschen, endl ist auch kein template sondern eine normale Funktion.



  • Blubbfisch schreibt Mist
    Edit: n3242: 27.7.1

    template <class charT, class traits>
    basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
    

    Wobei die Templateargumente natürlich nur weitergegeben werden, ist jetzt nicht gerade das Beispiel für Templates.



  • 314159265358979 schrieb:

    Muss dich enttäuschen, endl ist auch kein template sondern eine normale Funktion.

    Nein. Oder ist das gar spezifisch?
    Denn
    Aber ich hab mal in nem PDF von ner UNI gelesen:

    endl ist ein Template, auch wenn es von vielen nicht als solches gesehen wird.

    Eig. wär es trotzdem derbst unnötig, draus 'n template zu machen.

    Wolln wir Spielen bei der Wiese?



  • Nö, woll ich nicht.



  • Hacker schrieb:

    Eig. wär es trotzdem derbst unnötig, draus 'n template zu machen.

    Nö. Aus endl ein Template zu machen ist genauso nötig/unnötig wie aus basic_ostream eines zu machen. Und letzteres ist schwer sinnvoll.



  • spielverderber schrieb:

    Hacker schrieb:

    Eig. wär es trotzdem derbst unnötig, draus 'n template zu machen.

    Nö. Aus endl ein Template zu machen ist genauso nötig/unnötig wie aus basic_ostream eines zu machen. Und letzteres ist schwer sinnvoll.

    versteh nicht was du sagen willst. Es ist also doch nötig? Oder wie?



  • Es handelt sich bei endl in diesem Fall tatsächlich um eine Funktion, nämlich std::endl<char, std::char_traits<char> >. Gemacht wird da eine außerhalb dieses Kontextes selten benutzte Form der Parameterdeduktion. Ich kann auch

    #include <iostream>
    
    template<typename T>
    void foo(T x) {
      std::cout << x << std::endl;
    }
    
    void bar(void (*func)(int)) {
      func(2);
    }
    
    int main() {
      bar(foo); // foo ist hier foo<int>
    }
    

    schreiben, muss dann aber mit hochgezogenen Augenbrauen bei den meisten Leuten rechnen, die den Code mal lesen. Man kann auch keine Zeiger auf Templates herumreichen, weil diese zur Laufzeit ja nicht mehr existieren.


Anmelden zum Antworten