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.FormatGruß,
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
