Strings zusammensetzen



  • Hallo,

    weiss jemand, ob es eine Moeglichkeit gibt, das Zusammensetzen eines Strings aus String-Literalen und arithmetischen Variablen kompakt zu realisieren? Also ungefaehr sowas:

    int i = 0;
    string s;
    s = "a" + i + "b";
    

    Das geht so natuerlich nicht und ich mache es (nach meinem Ermessen recht umstaendlich) mit Stringstreams.



  • Hi,

    um bequem mit dem operator+ strings zu verketten könntest du ihn einfach überladen 😉



  • ingobulla schrieb:

    Hallo,

    weiss jemand, ob es eine Moeglichkeit gibt, das Zusammensetzen eines Strings aus String-Literalen und arithmetischen Variablen kompakt zu realisieren? Also ungefaehr sowas:

    int i = 0;
    string s;
    s = "a" + i + "b";
    

    Das geht so natuerlich nicht und ich mache es (nach meinem Ermessen recht umstaendlich) mit Stringstreams.

    Wieso soll das umständlich sein?

    //geht nicht, nur Beispiel
    int a = ...;
    double b = ...;
    std::string str;
    str = "a: " + a + "  b: " + b;
    std::cout << str;
    
    //mit stringstream
    int a = ...;
    double b = ...;
    std::stringstream strstr;
    strstr << "a: " << a << "  b: " << b;
    std::cout << strstr.str();
    

    Gleiche Anzahl an Zeilen, ein paar mehr Zeichen. Wo ist das Problem?



  • Es gibt so einige Alternativen zu der direkten Benutzung von stringstream.

    Beispiel1:

    #include <iostream>
    #include <string>
    #include <sstream>
    
    /// anything to string
    class a2str
    {
      std::stringstream ss;
    public:
      template<typename T>
      a2str& operator<<(T const& t) {ss << t; return *this;}
      operator std::string() const {return ss.str();}
    };
    
    int main()
    {
      std::string foo = a2str() << "foo " << 42 << '/' << 3.1415;
      std::cout << foo << '\n';
    }
    

    Beispiel2:
    siehe Boost.Format

    Gruß,
    SP



  • KasF schrieb:

    um bequem mit dem operator+ strings zu verketten könntest du ihn einfach überladen 😉

    Das geht nicht, solange nur Builtin-Typen unter den Operanden sind (und dazu gehören Stringliterale, also char[] ).

    Ich würde auch nicht versuchen, sowas hinzubiegen, nur weil ich das aus anderen Sprachen gewohnt bin. Das ist meist eine schlechte Idee. Aber Sebastian Pizer hat ja eine schöne kompakte Möglichkeit gezeigt.



  • Nexus schrieb:

    KasF schrieb:

    um bequem mit dem operator+ strings zu verketten könntest du ihn einfach überladen 😉

    Das geht nicht, solange nur Builtin-Typen unter den Operanden sind (und dazu gehören Stringliterale, also char[] ).

    Ich würde auch nicht versuchen, sowas hinzubiegen, nur weil ich das aus anderen Sprachen gewohnt bin. Das ist meist eine schlechte Idee. Aber Sebastian Pizer hat ja eine schöne kompakte Möglichkeit gezeigt.

    Wieso sollte das nicht gehen? Einer der Operanden wäre doch immer std::string .



  • Tachyon schrieb:

    Nexus schrieb:

    KasF schrieb:

    um bequem mit dem operator+ strings zu verketten könntest du ihn einfach überladen 😉

    Das geht nicht, solange nur Builtin-Typen unter den Operanden sind (und dazu gehören Stringliterale, also char[] ).

    Ich würde auch nicht versuchen, sowas hinzubiegen, nur weil ich das aus anderen Sprachen gewohnt bin. Das ist meist eine schlechte Idee. Aber Sebastian Pizer hat ja eine schöne kompakte Möglichkeit gezeigt.

    Wieso sollte das nicht gehen? Einer der Operanden wäre doch immer std::string .

    Schon, allerdings müsstest du, um den op+ immer zu finden, ihn im namespace std überladen (nicht machbar) oder im globalen namespace (unschön).



  • pumuckl schrieb:

    Tachyon schrieb:

    Nexus schrieb:

    KasF schrieb:

    um bequem mit dem operator+ strings zu verketten könntest du ihn einfach überladen 😉

    Das geht nicht, solange nur Builtin-Typen unter den Operanden sind (und dazu gehören Stringliterale, also char[] ).

    Ich würde auch nicht versuchen, sowas hinzubiegen, nur weil ich das aus anderen Sprachen gewohnt bin. Das ist meist eine schlechte Idee. Aber Sebastian Pizer hat ja eine schöne kompakte Möglichkeit gezeigt.

    Wieso sollte das nicht gehen? Einer der Operanden wäre doch immer std::string .

    Schon, allerdings müsstest du, um den op+ immer zu finden, ihn im namespace std überladen (nicht machbar) oder im globalen namespace (unschön).

    Bäh. Das war ja auch nur hypothetisch. :p



  • Tachyon schrieb:

    Wieso sollte das nicht gehen? Einer der Operanden wäre doch immer std::string .

    Ich meine sowas, also ähnlich wie z.B. in Java:

    std::cout << ("hallo" + 3) << std::endl;
    

    Das wirst du so oder so nicht hinkriegen.



  • Nexus schrieb:

    KasF schrieb:

    um bequem mit dem operator+ strings zu verketten könntest du ihn einfach überladen 😉

    Das geht nicht, solange nur Builtin-Typen unter den Operanden sind (und dazu gehören Stringliterale, also char[] ).

    Ich würde auch nicht versuchen, sowas hinzubiegen, nur weil ich das aus anderen Sprachen gewohnt bin. Das ist meist eine schlechte Idee. Aber Sebastian Pizer hat ja eine schöne kompakte Möglichkeit gezeigt.

    Ja stimmt, alles nicht ganz so schön. Das passiert wenn man mit C++ nicht mehr viel zu tun hat, die Erfahrung schwindet dahin 🙂


Anmelden zum Antworten