Strings aus beliebigen Datentypen zusamensetzen
-
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+.

-
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.