Was sind Templates und wofür braucht man diese?



  • Hallo

    Ich weiss, dass das eine sehr allgemeine Frage ist, aber ich habe in den FAQ nichts wirklich passendes gefunden. Ich habe keine Ahnung, wozu man diese braucht und benutzt.

    Danke für eure Hilfe.

    chrische



  • Templates sind Schablonen, also Platzhalter die jeden Typ darstellen können. Du verwendest Schablonen im wesentlichen um weniger Code schreiben zu müssen.



  • Aus "C++ Standard Library" von Josuttis:

    Templates are functions or classes that are written for one or more types not yet specified. When you use a template, you pass the types as arguments, explicitly or implicitly....

    Eine recht treffende Beschreibung, wie ich finde.

    Vielleicht hast Du sogar schon selbst mit Templates gearbeitet, ohne dass Du es gemerkt hast, wenn Du zum Beispiel so etwas wie vector<int> oder stack<float> verwendet hast. Solche Klassen sind aus der STL (standard TEMPLATE library), die wie der Name schon sagt eben aus Templates besteht.

    Ansonsten findest Du natürlich eine Menge über Templates im Stroustrup.

    Und nicht zu vergessen, viele Compiler sehen es vor, dass Du Deklaration und Definition in eine Datei schreiben musst.



  • ... und ich ertappe mich gerade selbst, wie ich die ständig die Typprüfung des C++ mit Templates übergehe.

    Spass beiseite:
    Im Prinzip sind Templates nur Platzhalter, welche fast wie Textersetzung zu Compilezeit funktionieren und sind daher auch typsicher sind.
    Man kann so z.B. Algorithmen beschreiben ohne sich dabei auf den Datentyp festzulegen.

    Früher hat man das mit einer ausgeprägten Ableitungshierarchie gemecht, in dem qausi alles von einem Urtyp und virtellen Basisklassen abgeleitet war.
    Diese virtuellen Basisklassen wurden nur geschaffen, um den Compiler "auszutricksen" und hatten keinen Bezug zu dem Inhalt des Programms.
    Ich würde das als das dunkle Mittelalter von C++ bezeichnen.

    Auch wenn einem bei Templates etwas unwohl werden kann, ist Templates die eindeutig bessere Alternative.

    /*Java hingegen möchte so wie es scheint aber gerne ein eigenes Mittelalter erleben und deswegen war dort wenigstens vor 2 Jahren alles "out-of-the-box" bis auf Elementartypen von einem ominösen Urtyp "Object" abgeleitet.*/



  • markus.r schrieb:

    Diese virtuellen Basisklassen wurden nur geschaffen, um den Compiler "auszutricksen" und hatten keinen Bezug zu dem Inhalt des Programms.
    Ich würde das als das dunkle Mittelalter von C++ bezeichnen.

    Auch wenn einem bei Templates etwas unwohl werden kann, ist Templates die eindeutig bessere Alternative.

    Ich hoffe für dich, dass du das nicht ernst gemeint hast. Abstrakte Basis-
    klassen können doch in keinster Weise durch Templates ersetzt werden.



  • Ich glaube markus.r, du solltest dich nochmal damit auseinander setzen was der Unterschied zwischen der Definition einer gemeinsamen Schnittstelle und der generischen Implementierung eines Problemstellung ist...



  • Hallo Chrische,

    Turing und Dali haben ja schon die Definition von Templates geliefert. Hier noch mal ein kleines Beispiel. Schreibe eine Funktion, die das Maximum von zwei Integer-Werten zurückgeben soll.

    int max( int i1, int i2 ) {
        if( i1 > i2 )
            return i1;
        return i2;
    }
    

    Das war einfach, aber später brauchst Du das gleiche für zwei char-Werte.

    char max( char c1, char c2 ) {
        if( c1 > c2 )
            return c1;
        return c2;
    }
    

    .. und beim nächstenmal vielleicht für std::string oder selbstgebaute Klassen und Du erkennst, dass Du im Prinzip immer den selben Code schreibst, nur der Typ von Parametern und Returnwert ändert sich. Dafür gibt es Templates

    template< typename T >  // T steht für den verwendeten Typen
    T max( T x1, T x2 ) {
        if( x1 > x2 )
            return x1;
        return x2;
    }
    

    Beim Aufruf kannst Du den Typen explizit mit angeben ..

    short a = 23;
        short b = -7;
        cout << "max: " << max< short >( a, b ) << endl;
    

    musst Du aber bei Funktionen nicht, da der Compiler aus den Parametern den Typ 'T' implizit selbst bestimmen kann.

    cout << "max: " << max( a, b ) << endl;
    

    'T' wird durch 'short' ersetzt, da 'a' und 'b' von Typ short sind.

    Gruß
    Werner



  • Hallo

    Fanke für dieses seh anschauliche Beispiel. Ich werde mal ein bisschen damit rumexperimentieren. In deinem Beispiel hatte ich aber das Gefühl, dass man das ganze auch mit Überladung einer Funktion erreichen könnte. Lieg ich da richtig und wenn ja, wo ist dann der Unterschied.

    chrische



  • Beim Überladen musst du jede Funktion für jeden Typ neu schreiben. Von der Verwendung her gibts dann keinen Unterschied her der Compiler macht schließlich auch nichts anderes. Nur eben DU musst all die Funktionen schreiben und das ist eben VIEL Zeit. Aber eben wenn ein C++ Buch zur Hand nehmen würdest kämmst da selber drauf 😉


Anmelden zum Antworten