Wieso kann man in C++ keine Strings mit Ints verknüpfen?



  • Dabei meine ich folgendes:

    std::string str = "String ... ";
    int val = 4;
    str += val;
    

    Warum geht das nicht? Jede andere Programmiersprache ist dazu in der Lage! Java, C#...
    Wird sich das mit dem nächsten Standard vielleicht ändern?

    Ja, das mag jetzt lächerlich erscheinen, aber das sind so kleine Unbequemlichkeiten, die im Alltag einfach nervig sind!



  • weil C++ besser ist als andere Sprachen



  • Wird sich das mit dem nächsten Standard vielleicht ändern?

    Ja da wird lexical_cast drin sein, was du aber auch jetzt über boost haben kannst



  • strings sind in c++ halt ein riesengroßer pain in the ass im vergleich zu java und c#

    musst halt sowas wie eben gesagt, boost verwenden, oder dir eine eigene version coden etc.



  • bei stringstream funktioniert das, wenn du anstatt += den << operator nutzt, das kann man dann später in ein string umwandeln. Jetzt sag nicht, das das unnötig viel aufwand wäre, bei Java gibt es eine StringBuilder klasse, mit der man auch anhängen kann, und dann am ende in ein fertigen string umwandelt. Aber hast recht, mit += wäre es schöner.



  • Doch, es ist viel Aufwand! Vorallem wenn du das ganze dann noch nach const char* haben willst, weil du mit irgend nem C-Müll rumwerkelst. Das heißt als Minimum fällt an:

    1.) Stringstream anlegen
    2.) Int in den Stringstream kopieren
    3.) Stringstream an den String anfügen
    4.) c_str() für den String aufrufen

    👎

    Ich hab mir gerade ein Beispiel für lexical_cast ergoogelt:

    // Numerische Daten werden in einem String-Ausdruck benutzt:
      void log_message(const std::string &);
    
      void log_error(int errnum) {
          log_message("Error "
            + boost::lexical_cast<std::string>(errnum)
            + ": " + strerror(errnum));
      }
    

    Das ist doch einfach mal OMG! Wieso machen die das so kompliziert? Wieso kann es nicht einfach eine String-Klasse geben, die ints akzeptiert? Ich dachte die krempeln auch mal die Sprache so richtig um und erweitern eben nicht nur die Standard-Lib?



  • Es nervt! schrieb:

    Warum geht das nicht? Jede andere Programmiersprache ist dazu in der Lage! Java, C#...

    C++ ist alt. seeeehrrr alt.
    🙂



  • asdjkagdjasgd schrieb:

    Es nervt! schrieb:

    Warum geht das nicht? Jede andere Programmiersprache ist dazu in der Lage! Java, C#...

    C++ ist alt. seeeehrrr alt.
    🙂

    Wieso wird mit dem nächsten Standard dem alten Sack noch Zucker in den Arsch geblasen, anstatt dass man ihm den Löffel nimmt und nem jungen, dynamischen Athleten übergibt?



  • Hat nichts mit dem Alter von C++ zu tun. Die C++ Erfinder würden das immer wieder so tun weil es vernünftig ist so wie es ist.



  • Auch wenn es trollig klingt, das ist das Ende von C++!

    😃 😉



  • Wieso ist es vernünftig? Ich sehe darin keinen Vorteil, nur Nachteile.



  • Es rockt! schrieb:

    Die C++ Erfinder würden das immer wieder so tun weil es vernünftig ist so wie es ist.

    stimmt nicht. wenn c++ heute erfunden würde, würde es ganz anders sein. damals wusste man es eben nicht besser. findet euch einfach damit ab, dass c++'s tage gezählt sind.
    c++ - rest in peace!



  • das ganze würde weak typing entsprechen
    sowas kann man ja machen wenn man php nutzt

    mit strong typing sind implizite casts nicht drin

    in python oder ruby geht das auch nicht und das aus gutem grund

    sobald man in eine situatuation kommt, wo a==b und b==c jedoch a!=c, bemerkt man, das man ein problem hat



  • ronny schrieb:

    das ganze würde weak typing entsprechen
    sowas kann man ja machen wenn man php nutzt

    mit strong typing sind implizite casts nicht drin

    in python oder ruby geht das auch nicht und das aus gutem grund

    sobald man in eine situatuation kommt, wo a==b und b==c jedoch a!=c, bemerkt man, das man ein problem hat

    Was hat das jetzt mit dem Problem zu tun? Man muss doch nur den + Operator für Zahlen überladen, da braucht man doch keine casts.



  • ich glaub das einzig Sinnvolle, was man in C++ mit Strings machen kann, ist sich ne eigene Klasse schreiben, die als Wrapper um nen anderen String rum verwendet wird. Dann hat man keine direkten abhängigkeiten zu anderen Frameworks und kann seinen String einfach erweitern. Und man hat nicht sowas wie std::string in seinen Projekt verteilt und 1000 Hilfsfunktionen dazu. Dann kann man auch einfacher auf Unicode umsteigen usw...



  • C++ < Perl 🤡



  • schonmal auf die idee gekommen, die + und += operatoren für std::string zu überladen?

    std::string& operator+(std::string& str, int i)
    {
    	std::stringstream ss;
    	ss << i;
    	str += ss.str();
    	return str;
    }
    

    dann kannst du auch ganz bequem

    std::string mystr = "the answer is ";
    mystr = mystr + 42;
    

    schreiben 😉

    Zusatz: Es ist imho sogar sehr vernünftig das so zu machen, der Programmierer bekommt die Chance, sich die Dinge so zurecht legen zu können, wie er sie braucht.
    und mit ein paar zeilen code kann man das gewünschte verhalten simulieren.



  • hast du auch mal geguckt, was passiert, wenn du das versuchst?

    std::string strNull = "Null = ";
    strNull += 0;
    

    jetzt hat dank dir std::string 2 Möglichkeiten:

    std::string& std::string::operator += (const char*);
    std::string& std::string::operator += (int);
    

    also wird der Compiler dir direkt sagen, dass du Mist gebaut hast.

    ich nehme an, dass die Erfinder von C++ genau aus diesem Grund die Möglichkeit
    einen Int anzuhängen weggelassen haben.


  • Mod

    DrakoXP schrieb:

    also wird der Compiler dir direkt sagen, dass du Mist gebaut hast.

    Was sogar gut wäre, denn 0 ist kein zulässiges Argument für den const char*-Overload.

    Natürlich gibt es viel wichtigere Gründe, keinen solchen Operator für int zu haben.
    string ist schon aufgebläht genug. Zudem würde wir dann auch noch Overloads für bool,short,float,double etc. haben wollen. Und spätestens (eigentlich von vornherein) stellt sich bei Gleitkommazahlen die Frage nach der Formatierung. Wollte man hier Freiheiten haben, müsste man zusätzliche Informationen im string speichern. Nicht zuletzt haben wir bereits streams. Wozu sollten wir noch eine zusätzliche (übergewichtige) Klasse brauchen, die die gleiche Funktionalität bietet?



  • DrakoXP schrieb:

    hast du auch mal geguckt, was passiert, wenn du das versuchst?

    std::string strNull = "Null = ";
    strNull += 0;
    

    jetzt hat dank dir std::string 2 Möglichkeiten:

    std::string& std::string::operator += (const char*);
    std::string& std::string::operator += (int);
    

    also wird der Compiler dir direkt sagen, dass du Mist gebaut hast.

    std::stringstream stream;
    	stream << "NULL = ";
    	stream << 0;
    
    	std::cout<<stream.str();
    

    Warum geht das bei stringstream aber nicht bei string?


Anmelden zum Antworten