<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[std::ostream nach std::ostringstream casten]]></title><description><![CDATA[<p>Um mir ettliche Aufrufe von lexical_cast zu ersparen, möchte ich alles auf einen ostringstream ausgeben und danach mittels str() einmalig einen String zu erzeugen.<br />
Wäre ja auch einfach, wenn es nicht als rvalue sein müsste:</p>
<pre><code class="language-cpp">myLog.write( (std::ostringstream() &lt;&lt; &quot; Value: &quot; &lt;&lt; 12.5f ).str() );
</code></pre>
<p>So gehts natürlich nicht, da op&lt;&lt; nur eine Referenz auf ostream zurückliefert.<br />
Ein cast von diesem ostream zu einem ostringstream will nicht so recht, danach hat<br />
man nur Datenmüll im String (was wohl auf ein ungültiges Objekt schließen lässt):</p>
<pre><code class="language-cpp">myLog.write( static_cast&lt; std::ostringstream* &gt;( &amp;( std::ostringstream() &lt;&lt; &quot; Value: &quot; &lt;&lt; 12.5f ) )-&gt;str() );
</code></pre>
<p>Aber das muss doch möglich sein, schließlich handelt es sich bei dem Objekt ja um ein std::ostringstream, somit sollte ein downcast doch ohne Probleme funktionieren.</p>
<p>Kennt jemand von euch eine Lösung?</p>
<p>Falls ihr euch fragt wozu ich das brauche, ich brauche es für meine Log-Einträge, damit ich das alles in ein DebugOutput()-Makro packen kann, ohne dass ich den String davor in einem #ifdef-block erzeugen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/155683/std-ostream-nach-std-ostringstream-casten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 17:14:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/155683.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Aug 2006 15:04:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::ostream nach std::ostringstream casten on Tue, 08 Aug 2006 15:04:45 GMT]]></title><description><![CDATA[<p>Um mir ettliche Aufrufe von lexical_cast zu ersparen, möchte ich alles auf einen ostringstream ausgeben und danach mittels str() einmalig einen String zu erzeugen.<br />
Wäre ja auch einfach, wenn es nicht als rvalue sein müsste:</p>
<pre><code class="language-cpp">myLog.write( (std::ostringstream() &lt;&lt; &quot; Value: &quot; &lt;&lt; 12.5f ).str() );
</code></pre>
<p>So gehts natürlich nicht, da op&lt;&lt; nur eine Referenz auf ostream zurückliefert.<br />
Ein cast von diesem ostream zu einem ostringstream will nicht so recht, danach hat<br />
man nur Datenmüll im String (was wohl auf ein ungültiges Objekt schließen lässt):</p>
<pre><code class="language-cpp">myLog.write( static_cast&lt; std::ostringstream* &gt;( &amp;( std::ostringstream() &lt;&lt; &quot; Value: &quot; &lt;&lt; 12.5f ) )-&gt;str() );
</code></pre>
<p>Aber das muss doch möglich sein, schließlich handelt es sich bei dem Objekt ja um ein std::ostringstream, somit sollte ein downcast doch ohne Probleme funktionieren.</p>
<p>Kennt jemand von euch eine Lösung?</p>
<p>Falls ihr euch fragt wozu ich das brauche, ich brauche es für meine Log-Einträge, damit ich das alles in ein DebugOutput()-Makro packen kann, ohne dass ich den String davor in einem #ifdef-block erzeugen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113101</guid><dc:creator><![CDATA[Thomas R.]]></dc:creator><pubDate>Tue, 08 Aug 2006 15:04:45 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream nach std::ostringstream casten on Wed, 09 Aug 2006 08:19:24 GMT]]></title><description><![CDATA[<p>Eine Möglichkeit wäre es, eine temporäre Variable dafür zu verwenden, deren Inhalt du dann weitergeben kannst.</p>
<p>Möglichkeit 2: Was für ein Typ ist &quot;myLog&quot; (das sieh nach einem Stream aus)?</p>
<p>Möglichkeit 3: static_cast und dynamic_cast funktionieren auch mit Referenzen:</p>
<pre><code class="language-cpp">myLog.write( dynamic_cast&lt; std::ostringstream&amp; &gt;( std::ostringstream() &lt;&lt; &quot; Value: &quot; &lt;&lt; 12.5f )-&gt;str() );//ungetestet
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1113487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113487</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 09 Aug 2006 08:19:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream nach std::ostringstream casten on Wed, 09 Aug 2006 10:34:34 GMT]]></title><description><![CDATA[<p>1. geht nicht, dann kann ich das ja nicht mehr innerhalb eines Funktionsaufrufes reinpacken<br />
2. ist kein Stream, verwendet intern aber einen Stream zur Ausgabe und nein eine direkte Ausgabe auf den Stream ist nicht möglich<br />
3. Ob Referenz oder Zeiger ändert nichts daran, dass es fehlschlägt (dynamic_cast schmeißt ne Exception/gibt NULL zurück).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113621</guid><dc:creator><![CDATA[Thomas R.]]></dc:creator><pubDate>Wed, 09 Aug 2006 10:34:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream nach std::ostringstream casten on Wed, 09 Aug 2006 10:43:30 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/libs/format/doc/format.html" rel="nofollow">http://www.boost.org/libs/format/doc/format.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113626</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Wed, 09 Aug 2006 10:43:30 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream nach std::ostringstream casten on Wed, 09 Aug 2006 10:45:24 GMT]]></title><description><![CDATA[<p>Genauso wie CStoll wollte ich es zunächst auch posten, habe es dann aber ausprobiert und es kam &quot;Müll&quot; heraus. Meine Vermutung:</p>
<p>Das ganze ist undefiniert, da das erzeugte Temporary unmittelbar nach dem Funktionsaufruf, in dem es genutzt wurde gelöscht werden darf. Und jener Funktionsaufruf ist operator&lt;&lt;( ostream&amp;, const char* ). D.h. schon beim zweiten operator&lt;&lt;, spätestens aber beim Cast, existiert der ostringstream schon garnicht mehr. Der Compiler &quot;weiss&quot; ja nicht, dass operator&lt;&lt; genau den ostream wieder zurückgibt, den er erhalten hat...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113627</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 09 Aug 2006 10:45:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream nach std::ostringstream casten on Wed, 09 Aug 2006 12:18:05 GMT]]></title><description><![CDATA[<p>Ja auf diese Schlussfolgerung bin ich auch gekommen, aber habe gehofft es gibt da ne Möglichkeit..</p>
<p>..und .filmor Danke für die Erinnerung an boost::format, daran hab ich schon gar nicht mehr gedacht. Das nehm ich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113703</guid><dc:creator><![CDATA[Thomas R.]]></dc:creator><pubDate>Wed, 09 Aug 2006 12:18:05 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream nach std::ostringstream casten on Fri, 11 Aug 2006 19:49:24 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Genauso wie CStoll wollte ich es zunächst auch posten, habe es dann aber ausprobiert und es kam &quot;Müll&quot; heraus. Meine Vermutung:</p>
<p>Das ganze ist undefiniert, da das erzeugte Temporary unmittelbar nach dem Funktionsaufruf, in dem es genutzt wurde gelöscht werden darf. Und jener Funktionsaufruf ist operator&lt;&lt;( ostream&amp;, const char* ). D.h. schon beim zweiten operator&lt;&lt;, spätestens aber beim Cast, existiert der ostringstream schon garnicht mehr. Der Compiler &quot;weiss&quot; ja nicht, dass operator&lt;&lt; genau den ostream wieder zurückgibt, den er erhalten hat...</p>
</blockquote>
<p>nein. temporaries werden erst am ende eines vollständigen ausdrucks zerstört. tatsächlich funktioniert</p>
<pre><code class="language-cpp">myLog.write( static_cast&lt; std::ostringstream* &gt;( &amp;( std::ostringstream() &lt;&lt; &quot; Value: &quot; &lt;&lt; 12.5f ) )-&gt;str() );
</code></pre>
<p>genauso wie es sein muss (und ist alles andere als undefiniert. dass dabei nicht das herauskommt, was man auf den ersten blick erwarten würde, liegt an einem designfehler der iostreams.</p>
<pre><code class="language-cpp">std::ostringstream()
</code></pre>
<p>ist ein rvalue; folglich werden in</p>
<pre><code class="language-cpp">std::ostringstream() &lt;&lt; &quot; Value: &quot;
</code></pre>
<p>überladungen des operators&lt;&lt;, die keine memberfunktionen von ostringstream sind, nicht brücksichtigt (da diese alle eine referenz auf non-const als linken parameter haben). dummerweise sind die standardüberladungen für diesen operator allerdings als memberfunktionen deklariert, und es gibt hier ein match für</p>
<p>ISO/IEC 14882:2003 27.6.2.1 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">basic_ostream&lt;charT,traits&gt;&amp; operator&lt;&lt;(const void* p);
</code></pre>
</blockquote>
<p>Ab dem zweiten operator &lt;&lt; in diesem ausdruck spielt das keine rolle mehr, denn dann ist der linke operand ein lvalue und alle überladungen werden gleich behandelt.</p>
<pre><code class="language-cpp">myLog.write( static_cast&lt; std::ostringstream&amp; &gt;( const_cast&lt; std::ostream&amp; &gt;( static_cast&lt; const std::ostream&amp; &gt;( std::ostringstream() ) ) &lt;&lt; &quot; Value: &quot; &lt;&lt; 12.5f ).str() );
</code></pre>
<p>könnte man nutzen; den code sollte man dann aber lieber niemandem zeigen (je nachdem, wie temporaries an referenzen auf const beim eingesetzten compiler gebunden werden, könnte das sogar undefiniertes verhalten sein) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>edit: einfacher wäre noch der aufruf einer anderen memberfunktion, die in diesem zusammenhang keinen effekt hat. das ist dann in jedem falle auch wohldefiniert:</p>
<pre><code class="language-cpp">myLog.write( static_cast&lt; std::ostringstream&amp; &gt;( std::ostringstream().flush() &lt;&lt; &quot;Value: &quot; ).str() );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1115511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115511</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 11 Aug 2006 19:49:24 GMT</pubDate></item></channel></rss>