Strings aus beliebigen Datentypen zusamensetzen



  • das boost:: vor str() ist überflüssig, str() wird per ADL gefunden



  • Sebastian Meier schrieb:

    throw new MyException("Fehler: Datei " + filename + " mit der Nummer " + id + " existiert nicht.");
    

    Wenn filename ein std::string oder const char* und id eine Ganzzahl ist, geht auch

    string("Fehler: Datei ") + filename + " mit der Nummer " + lexical_cast<string>(id) + " existiert nicht."
    

    Wichtig ist, dass der erste Teil ein std::string ist, damit die richtigen Operatoren verwendet werden. lexical_cast ist ebenfalls Teil von boost, hat man aber auch in drei Zeilen selbst mit std::stringstream geschrieben.



  • Michael E. schrieb:

    ..
    Wichtig ist, dass der erste Teil ein std::string ist, damit die richtigen Operatoren verwendet werden. lexical_cast ist ebenfalls Teil von boost, hat man aber auch in drei Zeilen selbst mit std::stringstream geschrieben.

    Es ist nicht nötig, dass der erste Teil ein std::string ist, solange einer der Operanden ein string ist.

    Bsp.:

    int id = 4;
    std::string msg = "Hallo " + std::string("Welt") + "! " + "c++" + boost::lexical_cast<std::string>(id) + "ever";
    


  • inter2k3 schrieb:

    Michael E. schrieb:

    ..
    Wichtig ist, dass der erste Teil ein std::string ist, damit die richtigen Operatoren verwendet werden. lexical_cast ist ebenfalls Teil von boost, hat man aber auch in drei Zeilen selbst mit std::stringstream geschrieben.

    Es ist nicht nötig, dass der erste Teil ein std::string ist, solange einer der Operanden ein string ist.

    Bsp.:

    int id = 4;
    std::string msg = "Hallo " + std::string("Welt") + "! " + "c++" + boost::lexical_cast<std::string>(id) + "ever";
    

    Nein, das stimmt auch nicht, mindestens einer der ersten beiden muss ein std::string sein, dann greift einer der Operatoren:

    string operator+ (const string& lhs, const string& rhs);
    string operator+ (const char* lhs, const string& rhs);
    string operator+ (char lhs, const string& rhs);
    string operator+ (const string& lhs, const char* rhs);
    string operator+ (const string& lhs, char rhs);
    
    string x = "Hello" + " " + string( "Welt" );
    

    geht nicht.



  • Ja - da hab ich mich wohl nicht klar genug ausgedrückt. Wollte aber genau das aussagen im Prinzip.

    Mit "einer der Operanden" meinte ich jeweils einen der beiden Operanden des operators+.

    😃


  • Mod

    manni66 schrieb:

    string x = "Hello" + " " + string( "Welt" );
    

    geht nicht.

    Wenn du jetzt wieder das + zwischen "Hallo" und " " wegnimmst, sollte es übrigens wieder gehen 🙂



  • Hier stinkts nach Klugscheiß.



  • Booooooooooah schrieb:

    Hier stinkts nach Klugscheiß.

    Klugschiss



  • inter2k3 schrieb:

    Es ist nicht nötig, dass der erste Teil ein std::string ist, solange einer der Operanden ein string ist.

    Ach herrje, falsche Sprache. Sorry.



  • Danke, eure Antworten haben mir wirklich weitergeholfen (ernst gemeint).

    👍



  • Sebastian Meier schrieb:

    da ich aus der Java-Richtung komme, vermisse ich in C++ die intuitive Möglichkeit, Strings aus beliebigen Datentypen zusammenzusetzen:

    throw new MyException("Fehler: Datei " + filename + " mit der Nummer " + id + " existiert nicht.");
    

    Aber so etwas vermeidet man auch in Java -- zugunsten von StringBuilder -- da sonst ganz schön langsam.

    Wenn filename ein std::string ist, klappen zumindest schonmal die ersten beiden op+.

    Sebastian Meier schrieb:

    In C++ habe ich mir bis jetzt so beholfen:

    std::stringstream out;
    out << "Fehler: Datei " << filename << " mit der Nummer " << id << " existiert nicht.";
    throw std::runtime_error(out.str());
    

    Hat jemand eine geniale Idee, wie man diesen Dreizeiler möglichst elegant auf eine Zeile reduzieren kann?

    Kannst Du Boost.Format benutzen, oder diese stringstream-Sache kapseln:

    // anythung to string
    class a2str {
      stringstream ss;
    public:
      template<class T>
      a2str& operator<<(T const& x) {
        ss << x;
        return *this;
      }
      operator string() const {
        return ss.str();
      } 
    };
    
    ...
    
    throw runtime_error(a2str() << 23 << " + " << 42 << " = " << 65);
    

    (ungetestet)



  • krümelkacker schrieb:

    ...diese stringstream-Sache kapseln:...

    Nette Idee!! 😋

    Muss ich mal mit rumspielen ....

    Gruß,

    Simon2.


Anmelden zum Antworten