Templates - nur "unabhängige" Funktionen?



  • Hallo,

    ich hoffe, dass ich mich richtig ausdrücke - denn ich bin noch recht neu im C++ Umfeld.

    Meine Frage bezieht sich auf Templates. Genauergesagt auf Template-Klassen. Wenn ich das richtig verstanden sind Templates Schablonen für Funktionen (Funktionstemplates) oder für Objekte (Klassentemplates). Hier mal ein kleines Beispiel:

    template <class T>
    T myClass<T> :: add( T intA, T intB ) {
     return intA + intB;
    }
    

    Dies ist eine Implementierung einer Memerfunktion einer meiner Klassen. Ich kann dies Klasse bzw. Memberfunktion so benutzten:

    myClass <int> myClassObject;
    cout << myClassObject.add( 1, 7 );
    

    Ausgegeben wird der Wert 8. Diese Memberfunktion kann aber auch Strings appenden:

    myClass <string> myClassObject;
    cout << myClassObject.add( "Frohe ", "Weihnachten" );
    

    Zwar eine recht sinnlose art Templates zu verwenden aber mir ist nichts besseres eingefallen.

    Die Problematik: Ich kann ja nun nicht einfach so z.B Stringspezifische Funktionen verwenden. Ich kann in Templatememberfunktionen "nur" Funktionen verwenden, die ich auf alles und jeden anwenden kann. Falls ich dies richtig verstehe: Für was benötigt man dann Templates? 😉
    Klar ich könnte Templates auch überladen u.s.w aber das ist ja dann (so denke ich) wieder eine entfremdung des Grundgedankens.

    Ich bin mir sicher, dass Templates ganz toll und nützlich sind. Ich als Anfänger sehe in Templates eigentlich keinen großen Sinn, auch wenn ich selbst Templateklassen der STL (z.B vector <string>) täglich verwende.

    Ich hoffe keine DAU/RTFM Frage gestellt zu haben.

    :xmas1:



  • mit Templates kannst du EINE Klasse schreiben, die für verschiedene Datentypen funktioniert. Das spart zB Schreibarbeit (naja, kein tolles Argument) und dein Code ist bvesser wiederverwendbar. ZB std::vecotr<> Er kann alles speichern, was du willst, obwohl er nur einmal implementiert wurde.
    Mit Templates fasst man also sozusagen Algorithmane zusammen, die man auf eine Vielzahl von Datentypen anwenden kann, ohne für jeden Datentyp eine eigene Funktion zu schreiben



  • ChristianCgi schrieb:

    Die Problematik: Ich kann ja nun nicht einfach so z.B Stringspezifische Funktionen verwenden. Ich kann in Templatememberfunktionen "nur" Funktionen verwenden, die ich auf alles und jeden anwenden kann.

    Doch, geht auch:

    template<class Container, class T>
    void add(Containert& c, T x)
    {
      c.push_back(x);
    }
    

    Dem kannst du jetzt jedes Objekt geben, was eine push_back-Methode hat.



  • Hallo,

    Danke für die Antwort.
    Das was du erwähnt hast ist mir alles klar.

    Okay ich mache mal ein Beispiel:
    Ich will eine Template-Klasse schreiben, die eine Memberfunktion enthält, die mit den letzten char oder die letzte Zahl zurückgibt.

    zb:

    string myString("Hallo");
    myClass <string> myClassObject;
    cout << myClassObject.getLastChar(myString);
    

    Das ganze sollte dann "o" ausgeben.

    Und das ganze sollte auch so funktionieren:

    int intZahl = 456;
    myClass <int> myClassObject;
    cout << myClassObject.getLastChar(intZahl);
    

    Und hier sollte 6 ausgegeben werden.

    Habe ich hier jetzt den Sinn und Zweck von Templates falsch verstanden?
    Ich bräuchte halt ein praktisches Beispiel, wo mir der Sinn und Zweck von Templates klar wird.

    Danke



  • und Templates ermöglichen Expression Templates und sonstige Meta Programmier Anwendungen.



  • ChristianCgi schrieb:

    Habe ich hier jetzt den Sinn und Zweck von Templates falsch verstanden?
    Ich bräuchte halt ein praktisches Beispiel, wo mir der Sinn und Zweck von Templates klar wird.

    dann musst du das template für int eben spezialisieren. wobei ich dann eher den weg über streams gehen würde.

    aber du siehst templates nur als Container<T> - sie können aber viel mehr.

    nimm zB mal CallTraits. hier kannst du automatisch den besten übergabe type wählen.

    du schreibst
    CallTrait<string>::constParam udn erhältst einen string const&
    bei CallTrait<int>::constParam erhätst du int - so bist du immer sehr effizient.

    Templates sind aber auch schablonen, so wie du sie verwendest. doch int und string haben, was den operator[] angeht, nicht viel gemeinsam. deswegen passen die beide nicht gut in eine schablone, die den operator[] verlangt...



  • Hallo,

    danke an alle. Dann werde ich mir einfach noch mehr Informationen zu den Templates holen.

    Danke schonmal für die Tipps und Stichwörter.

    Gruss und noch schöne Feiertage.



  • 'C++ Templates' ist DAS Buch zu Templates

    Ansonsten gibts glaub ich von 'Modern C++ Design' Probekapitel, die kannst du auch mal lesen.

    du kannst dir ja auch mal Blitz++ und boost ansehen - da gibts auch ne menge verwendung von Templates 🙂



  • Eine Sache noch, die wohl noch nicht so explizit gesagt wurde:
    Dein erstes Beispiel mit der add-Funktion stellt an die Klasse, die als Templateparameter übergeben wird auch eine Anforderung. Und zwar: sie muss den +Operator überladen haben. Wenn du mal ein Buch durchliest in der maps oder ähnliches behandelt werden, steht auch immer: Die Klasse muss folgende Operatoren überladen haben: Und dann kommen Operatoren wie '=', '<' usw ...



  • Nachtrag:
    http://www.mitp.de/imperia/md/content/vmi/29842/1.pdf?PHPSESSID=c67c10a97184f90f0ebf256fc9ba0bf6

    Ein Kapitel aus 'OOP für Dummies', dass es leider nicht mehr ins Buch geschafft hat, dafür ist es online verfügbar 🙂



  • Hi,

    ich habe mir folgende Bücher schon vor zwei Tagen bestellt:

    ISBN: 3-89842-171-6
    ISBN: 3-89842-397-2

    Die warte ich mal ab 😉

    Danke für alles. Ihr seits echt sehr hilfreich.





  • coole Covers 😃



  • Da gerade ein paar Buchtitel gefallen sind:

    Könnt ihr mir ein paar Bücher zu C++ Design empfehlen.
    Also:
    Design Patterns usw.
    "modern C++ Design" kenn ich schon (und werde es mir bald kaufen).
    Taugt Marc++us´s OOP Buch etwas?



  • Jover schrieb:

    Taugt Marc++us´s OOP Buch etwas?

    es ist gut, aber ich kenne dich leider nicht gut genug um sagen zu können ob es dir etwas bringt.

    es füllt die lücke zwischen einsteigern und fortgeschrittenen. lies mal die probe kapitel - wenn sie dir zusagen, dann ist es wahrscheinlich eine gute wahl 🙂

    wenn du etwas zum thema design pattern suchst:

    Entwurfsmuster | ISBN: 3827318629
    Pattern Hatching | ISBN: 0201432935

    oder was meinst du mit 'Code Design'?

    vielleicht 'Regeln' ala (More) Effective C++ oder Effective STL?
    also etwas im Stile von www.gotw.ca/gotw



  • Shade Of Mine schrieb:

    es füllt die lücke zwischen einsteigern und fortgeschrittenen. lies mal die probe kapitel - wenn sie dir zusagen, dann ist es wahrscheinlich eine gute wahl 🙂

    Ich habe das Probekapitel über Template-Metaprogramming überflogen und das war sehr interessant. In der Buchbesprechung habe ich aber geleseen, dass auch viele Grundlagen über Klassen, Ojekten, usw. gelehrt werden. Das will ich nicht so. Ich will ein (paar) spezielle(s) Bu(e)ch(er) über Design Pattern, wie man sie richtig anwendet und Wie man richtig OO Programmiert.

    Werde mir die beiden Bücher die du geposted hast näher ansehen.

    Shade Of Mine schrieb:

    vielleicht 'Regeln' ala (More) Effective C++ oder Effective STL?

    Sind das nicht diese Bücher wo so eine Art Frage/Antwort Spiel stattfindet?



  • dann ist OOP für Dummies wohl nicht so deins.

    (More) Exceptional C++ ist das Frage-Antwort Speil -> siehe GotW

    (More) Effective C++ und Effective STL stellen regeln auf. zB:

    Bevorzugen Sie const und inline gegenüber #define

    und dann wird erklärt warum, wieso und weshalb



  • Ich habe jetzt das Probekapitel von OOP für Dummies durch und bin begeistert.
    Ist modern C++ Design auch so verständlich?

    Was ist der Unterschied zwischen Entwurfmustern und Design Pattern?



  • Entwurfsmuster ist der deutsche Name und Design Pattern der englische 🙂

    ich fand Modern C++ Design nicht so gut zu lesen wie OOP für Dummies, aber es war verständlich.



  • Shade Of Mine schrieb:

    Entwurfsmuster ist der deutsche Name und Design Pattern der englische 🙂

    Uuups, habe da wohl etwas zu hastig gelesen. Habe geglaubt, dass das 2 versch. dinge sind. 🤡

    Dann Danke für deine Hilfe.

    PS. Beim Fakultätsbeispiel kann ich nur zahlen <= 12 verwenden. Was muss ich einstellen, damit das mit größeren geht?


Anmelden zum Antworten