Newbie: Vernünftiger Umgang mit Strings?





  • Artchi schrieb:

    Du mußt als erstes lernen was Templates sind, um WritableRangeT zu verstehen. Bei Templates handelt es sich "nur" um Codeschablonen, die erst zur Compilezeit typisiert werden. Grob gesagt kann WritableRangeT jeder Typ sein, mit dem das Template "kompatibel" ist. Range deutet darauf hin, das es ein Array, String, Vector etc. sein kann. Der vollständige Aufruf müsste so lauten:

    string s("HaLLo!");
    to_lower<string>(s);     // mit <string> typisiere ich WritableRangeT bzw. das Template
    

    So weiß die Funktion, das s ein String-Objekt ist. Aber da bei solchen einfachen Funktionen der Compiler aus dem übergebenen Wert "s" den Typ string selber feststellen kann, muß man das nicht angeben.

    string s("HaLLo!");
    to_lower(s);     // <string> setzt der Compiler selbst ein... implizite Typisierung
    

    Der Vorteil von Templates ist, das man Code für verschiedenen Typen benutzen kann. Und man spart sich Copy&Paste in seinem Code. D.h. to_lower kann auch mit Arrays, Vector usw. arbeiten.

    Also, geht es darum, dass ich a) einer Funktion dann unterschiedliche, sinnvolle Typen übergeben kann und b) je nach Eingabetyp in der Funktion handeln kann? Bspw. könnte eine Funktion sowohl ein Char-Array als auch einen String bekommen?

    Und irgendwas habe ich doch sicher übersehen: an so einer Funktionssignatur "..(WritableRangeT ...) sehe ich doch gar nicht, welche(r) Typ(en) denn nun erlaubt sind?

    Das & steht für By-Reference, also das die Funktion mit dem "original" Objekt arbeitet bzw. dieses manipulieren wird. Weitere Infos gibt es unter http://www.kharchi.eu/wiki/doku.php?id=cpp:std:reference.

    Hast du ein vernünftiges C++-Buch, in dem solche Dinge ausführlich und vor allem verständlich erklärt werden? Weil für C++ kommt man mit Try & Error nicht schnell vor ran.

    Ja, habe ein Buch von Dirk Louis. Muss ich nochmal lesen, ich glaube da stand etwas in der Zeiger-Ecke, eine Giftküche, an der ich schnell vorbeigelesen hatte. 😃



  • ganz ehrlich, merkt ihr es noch? er will einen string per tolower umwandeln und bekommt templates, boost oder qt vorgesetzt. Irgendwas stimmt da doch ganz gewaltig nicht...



  • Wenn er auf Boost verzichten will, kann er doch die, ein paar Seiten weiter vorne gepostete, einfache und funktionierende Lösung verwenden:

    #include <algorithm>
    #include <string>
    
    std::string test = "THIS IS MY STRING";
    std::transform(test.begin(), test.end(), test.begin(), std::tolower);
    


  • jaja schrieb:

    ganz ehrlich, merkt ihr es noch? er will einen string per tolower umwandeln und bekommt templates, boost oder qt vorgesetzt. Irgendwas stimmt da doch ganz gewaltig nicht...

    C++ ... kompliziertes Denken ... irgendwas war da.



  • jaja schrieb:

    ganz ehrlich, merkt ihr es noch? er will einen string per tolower umwandeln und bekommt templates, boost oder qt vorgesetzt. Irgendwas stimmt da doch ganz gewaltig nicht...

    Vielleicht hast du nichts bemerkt, aber es geht hier in diesem Topic schon laaange nicht mehr um "Wie mache ich Zeichen klein?". Es geht hier mittlerweile um C++-Syntax und -Features, am Beispiel von to_lower. Es könnte aber auch jede andere Funktion aus C++ sein! Er hätte bei jeder anderen C++-Funktion die gleichen Fragen gestellt. Er lernt noch C++, das hat nichts mit Boost oder so zu tun. Wer kein C++ kann, wird nun mal solche Fragen stellen. Das er noch kein C++ kann, kann ja wohl C++ oder Boost nichts für.



  • Für einen Einsteiger mag C++ schwerer sein als andere Sprachen...
    Aber wie oft saß ich schon bei der Arbeit (komplexe Webapplikation in PHP)
    und dachte mir:
    Wie gern hätte ich jetzt Mehrfachvererbung ?
    Was gäbe ich nicht für Templates?
    Wo ist die transparente Laufzeitpolymorphie?
    Wo die strikte Typisierung?

    Und jedesmal wünschte ich mir C++ herbei...

    Die mächtigen Features von von C++ steigern natürlich die Komplexität der Sprache,
    erleichtern aber die Arbeit damit um ein vielfaches, wenn man angefangen hat, sie zu durchschauen.



  • Artchi schrieb:

    jaja schrieb:

    ganz ehrlich, merkt ihr es noch? er will einen string per tolower umwandeln und bekommt templates, boost oder qt vorgesetzt. Irgendwas stimmt da doch ganz gewaltig nicht...

    Vielleicht hast du nichts bemerkt, aber es geht hier in diesem Topic schon laaange nicht mehr um "Wie mache ich Zeichen klein?".

    Ne, um wie mache ich einen String klein.



  • Squeller schrieb:

    Also, geht es darum, dass ich a) einer Funktion dann unterschiedliche, sinnvolle Typen übergeben kann und b) je nach Eingabetyp in der Funktion handeln kann? Bspw. könnte eine Funktion sowohl ein Char-Array als auch einen String bekommen?

    Richtig. Denn ohne Templates, müsste der Bibliotheks-Entwickler alle möglichen Typen beachten und z.B. eine Funktion für Array und eine für Strings bereit stellen... was in einer Copy&Paste-Orgie enden würde. Und wenn du doch Vector benutzen willst, würde die spezielle Funktion fehlen. Also schreibt man ein Template (eine Schablone), und sagt dem User: sag dem Template welcher Typ, und der Compiler macht dann im Hintergrund Copy&Paste mit dem Wunschtyp. 😉

    Squeller schrieb:

    Und irgendwas habe ich doch sicher übersehen: an so einer Funktionssignatur "..(WritableRangeT ...) sehe ich doch gar nicht, welche(r) Typ(en) denn nun erlaubt sind?

    Ja, das kannst du anhand der Dokumentation erfahren. Du kannst aber auch anhand des "Range" einen Hinweis bekommen, das es ein Range (Reihe, Kollektion u.ä.) sein sollte. D.h. potentiell ein Array, ein String, eine List, ein Vector usw. Wenn ein Typ nicht zu dem Template passt, wird der Compiler meckern.

    Das WritableRangeT sagt doch eigentlich schon viel:
    1. Writable: Beschreibbar (also nicht const)
    2. Range: Reihe, Kollektion (also begin bis end)
    3. T: Typ 😉

    Es sollte eigentlich für den nächsten C++-Standard (C++0x) eine drastische Verbesserung geben: Concepts. Eine Spracherweiterung, wo der Template-Entwickler direkt die Bedingungen formulieren kann. Das Feature wird aber aus Zeitgründen für C++0x fallen gelassen. Wird aber in einem nachfolgenden Standard natürlich wieder versucht! Die Idee ist also nicht gestorben.

    Bei solchen Dingen bleibt dir nichts übrig, als die Doku zu lesen. Und halt Erfahrung.

    Ja, habe ein Buch von Dirk Louis. Muss ich nochmal lesen, ich glaube da stand etwas in der Zeiger-Ecke, eine Giftküche, an der ich schnell vorbeigelesen hatte. 😃

    OK, Dirk Louis Bücher sind eher die schlechteren. Es gibt leider viele schlechte C++-Bücher auf dem Markt. Eben weil C++ so komplex ist und nicht jeder ein guter Lehrer sein kann. Hier mal zwei Bücher, die wirklich top sind:

    Der C++ Programmierer von Ulrich Breymann
    C++ Primer von Stanley B. Lippman / Josée Lajoie / Barbara E. Moo



  • Kann bitte mal ein Moderator die sinnfreien Postings löschen? Sie tragen zum Verständnis der Topicstarters nichts bei und stiften nur Unruhe. Danke!



  • branleb schrieb:

    Aber wie oft saß ich schon bei der Arbeit (komplexe Webapplikation in PHP)
    und dachte mir:
    Wie gern hätte ich jetzt Mehrfachvererbung ?
    Was gäbe ich nicht für Templates?
    Wo ist die transparente Laufzeitpolymorphie?
    Wo die strikte Typisierung?

    Und jedesmal wünschte ich mir C++ herbei...

    Warum nimmst du es dann nicht?



  • wx++ schrieb:

    Wenn er auf Boost verzichten will, kann er doch die, ein paar Seiten weiter vorne gepostete, einfache und funktionierende Lösung verwenden:

    #include <algorithm>
    #include <string>
    
    std::string test = "THIS IS MY STRING";
    std::transform(test.begin(), test.end(), test.begin(), std::tolower);
    

    Ich bin mir sicher, das er schon erfolgreich boost::to_lower einsetzt! Er aber einfach nur gerne wissen will, was er da benutzt. In einem anderen Thread benutzt er es jedenfalls schon.

    Bei std::transform würden die gleichen Fragen aufkommen, da es schließlich auch eine Template-Funktion ist.



  • und schrieb:

    branleb schrieb:

    Aber wie oft saß ich schon bei der Arbeit (komplexe Webapplikation in PHP)
    und dachte mir:
    Wie gern hätte ich jetzt Mehrfachvererbung ?
    Was gäbe ich nicht für Templates?
    Wo ist die transparente Laufzeitpolymorphie?
    Wo die strikte Typisierung?

    Und jedesmal wünschte ich mir C++ herbei...

    Warum nimmst du es dann nicht?

    Das dachte ich mir auch mal. Ich habe damals HTML::Mason verwendet, was so ein PHP für Perl ist, also einbetten von Perl in HTML. Da habe ich mich einfach mal hin gesetzt und habe das ganze für C++ umgesetzt. Jetzt habe ich das alles 🙂 .



  • Naja die Entscheidung liegt ja nicht bei mir, es arbeiten ja noch 12 andere Entwickler dran, teilweise schon länger wie ich. Und das Ding wurde halt in PHP entwickelt...


Anmelden zum Antworten