int to string



  • Guten Tag

    Hier gäbe es noch ein Macro, dass man auch ganz gut für Widestrings nutzen könnte. Einfach entsprechend anpassen.

    http://rootdirectory.de/wiki/SSTR%28%29#TheSSTRmacro

    Freundliche Grüsse

    wachs



  • wachs schrieb:

    Hier gäbe es noch ein Macro, dass man auch ganz gut für Widestrings nutzen könnte. Einfach entsprechend anpassen.

    http://rootdirectory.de/wiki/SSTR%28%29#TheSSTRmacro

    Die Tatsachen, dass es ein Makro ist und unnötigerweise dynamic_cast verwendet disqualifizieren es schon von vornherein.



  • Naja eine Möglichkeit ist es trotzdem.

    Es ist auch sehr 'nonperformance' muss ich jetzt gerade feststellen.

    gruss

    wachs



  • Danke für das Makro, für meine Dialoganwendung spielt eine schlechtere Performance keine Rolle.


  • Mod

    Ja, aber static_cast kann da mindestens noch verwendet werden. Was std::dec da verloren hat ist mir schleierhaft, ist es doch eines der Flags die sowieso schon gesetzt sind. Und suboptimaler als stoi ist es allemal.



  • @Kerzen hat sich doch vorher doch auf die Compilereinstellung bezogen oder? Ich habs auf jedenfall so verstanden. So viel ich weiss, gibt es Compiler, bei denen man das extra aktivieren muss. 'static_cast' sollte auch funktionieren, habs aber nicht ausprobiert.

    Gruss

    wachs

    Edit: @Arcoth du hast recht, ich habs einfach so übernommen.



  • kerzen schrieb:

    Die Tatsachen, dass es ein Makro ist und unnötigerweise dynamic_cast verwendet disqualifizieren es schon von vornherein.

    Hmm... ich bin nicht so bewandert in der Stream-Klassenhierarchie, aber ist std::ostringstream nicht von std::ostream abgeleitet, und gibt der << -Operator nicht einen std::ostream& zurück?
    In diesem Fall wäre das nämlich ein Downcast, und der erfordert meines wissens ein dynamic_cast . Daher is es meines erachtens nicht "unnötig" - andere Kritikpunkte an dem Makro klammere ich mal aus (z.B. dass man das Ganze auch wunderbar als Funktion implementieren kann - unnötig ist auf jeden Fall dass es ein Makro ist).

    Finnegan



  • Finnegan schrieb:

    In diesem Fall wäre das nämlich ein Downcast, und der erfordert meines wissens ein dynamic_cast .

    Geht auch mit static_cast , gibt dann aber keine Überprüfung ob es wirklich mal ein ostringstream war. Aber das ist in diesem Fall eh ziemlich sicher (außer irgendwer hat komisch überladene operator<< definiert).



  • Bei virtueller Vererbung ist auch unter bestimmten Bedingungen ein dynamic_cast nötig.



  • Arcoth schrieb:

    Was std::dec da verloren hat ist mir schleierhaft [...]

    Falls sich noch jemand wundert: Der operator<< für const char* beispielsweise ist eine freie Funktion und keine Memberfunktion von basic_ostream . Das Problem zu C++98 Zeiten war nun, dass die freie Funktion den Stream als Referenz nimmt (const Reference geht ja nicht, weil wir in den Stream schreiben wollen) und im Beispiel der Stream ein temporäres Objekt ist. Und da normalen Referenzen nunmal keine RValues binden, kann keine der freien Funktionen aufgerufen werden. Es bleiben also nur die Memberfunktionen über und dort wird für const char* der const void* Overload ausgewählt. Statt dem String sieht man dann nur dessen Adresse. Dadurch, dass man irgendein sinnloses Flag mit std::dec ändert kriegt man eine normale Referenz. Glücklicherweise gibts seit C++11 eine freie Funktion mit RValue Reference, sodass dieser Hack nicht mehr notwendig ist.


  • Mod

    sebi707 schrieb:

    Arcoth schrieb:

    Was std::dec da verloren hat ist mir schleierhaft [...]

    Falls sich noch jemand wundert: Der operator<< für const char* beispielsweise ist eine freie Funktion und keine Memberfunktion von basic_ostream . Das Problem zu C++98 Zeiten war nun, dass die freie Funktion den Stream als Referenz nimmt (const Reference geht ja nicht, weil wir in den Stream schreiben wollen) und im Beispiel der Stream ein temporäres Objekt ist. Und da normalen Referenzen nunmal keine RValues binden, kann keine der freien Funktionen aufgerufen werden. Es bleiben also nur die Memberfunktionen über und dort wird für const char* der const void* Overload ausgewählt. Statt dem String sieht man dann nur dessen Adresse. Dadurch, dass man irgendein sinnloses Flag mit std::dec ändert kriegt man eine normale Referenz. Glücklicherweise gibts seit C++11 eine freie Funktion mit RValue Reference, sodass dieser Hack nicht mehr notwendig ist.

    👍
    Ich hatte völlig vergessen, dass vor C++11 so etwas nicht möglich war. Ich dachte aus irgendeinem Grund, dass, gerade weil dort ein temporäres SStream Objekt verwendet wird, dieser Artikel verfasst wurde als C++11 schon entsprechend weit war.

    PS: Was soll dieses "falls sich noch jemand wundert"? Hättest du es für mich nicht geschrieben? 😃



  • Arcoth schrieb:

    PS: Was soll dieses "falls sich noch jemand wundert"? Hättest du es für mich nicht geschrieben? 😃

    Ich hab mich selbst auch gewundert. Auf der Seite wird zwar etwas erklärt aber da fehlten ein paar Details, sodass ich da selbst auch erst nicht schlau draus geworden bin.


  • Mod

    😮 Den verdammt fetten Stichpunkt zu genau diesem Teil habe ich auf der Seite übersehen, da ich jegliche Erklärung unter dem Code als für mich unwichtig ansah.


Anmelden zum Antworten