<?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::endl]]></title><description><![CDATA[<pre><code class="language-cpp">class Log
{
  ostream os;
  public:
    Log&amp; operator &lt;&lt; (char c)
    {
      os &lt;&lt; c;
      return *this;
    }

  // anderer Krempel..
};
</code></pre>
<p>Wie kann ich in meine Klasse so schreiben, dass sie auch std::endl akzeptiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/124698/std-endl</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 02:27:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/124698.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Oct 2005 14:48:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::endl on Sun, 30 Oct 2005 14:48:33 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Log
{
  ostream os;
  public:
    Log&amp; operator &lt;&lt; (char c)
    {
      os &lt;&lt; c;
      return *this;
    }

  // anderer Krempel..
};
</code></pre>
<p>Wie kann ich in meine Klasse so schreiben, dass sie auch std::endl akzeptiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/903919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/903919</guid><dc:creator><![CDATA[Orillion]]></dc:creator><pubDate>Sun, 30 Oct 2005 14:48:33 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Sun, 30 Oct 2005 14:52:57 GMT]]></title><description><![CDATA[<p>Du musst für basic_ostream überladen.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/903920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/903920</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 30 Oct 2005 14:52:57 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Sun, 30 Oct 2005 19:46:09 GMT]]></title><description><![CDATA[<p>so ginge es auch(dann kannste auch mehr ausgeben, als einzelne zeichen :D)</p>
<pre><code class="language-cpp">class Log
{
  ostream os;
  public:
    template&lt;class T&gt;
    Log&amp; operator &lt;&lt; (const T&amp; c)
    {
      os &lt;&lt; c;
      return *this;
    }

  // anderer Krempel..
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/904068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/904068</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 30 Oct 2005 19:46:09 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Sun, 30 Oct 2005 19:50:16 GMT]]></title><description><![CDATA[<p>streambuf bauen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/904073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/904073</guid><dc:creator><![CDATA[rrrrrrrrrrrrr]]></dc:creator><pubDate>Sun, 30 Oct 2005 19:50:16 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Sun, 30 Oct 2005 22:25:13 GMT]]></title><description><![CDATA[<p>Orillion schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Log
{
  ostream os;
  public:
    Log&amp; operator &lt;&lt; (char c)
    {
      os &lt;&lt; c;
      return *this;
    }

  // anderer Krempel..
};
</code></pre>
<p>Wie kann ich in meine Klasse so schreiben, dass sie auch std::endl akzeptiert?</p>
</blockquote>
<p>std::endl ist eine Funktion; bzw. genauer eine Template-Funktion. Die Signatur ist</p>
<pre><code class="language-cpp">template &lt;class charT, class traits&gt;
  basic_ostream&lt;charT,traits&gt;&amp; endl( basic_ostream&lt;charT,traits&gt;&amp; os );
</code></pre>
<p>Wenn die Ausgabe immer auf einen std::ostream gehen soll, so genügt es einen operator für Funktionen hinzuzufügen:</p>
<pre><code class="language-cpp">class Log
{
public:
    typedef std::ostream&amp; (*manip_type)( std::ostream&amp; );
    Log&amp; operator&lt;&lt;( manip_type manip )
    {
        os &lt;&lt; manip;
        return *this;
    }
    // anderer Krempel..
};
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/904191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/904191</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 30 Oct 2005 22:25:13 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Sun, 30 Oct 2005 23:27:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Das klingt nicht sonderlich brauchbar und ist imho nciht im Sinne des Erfinders.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/904215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/904215</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 30 Oct 2005 23:27:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Mon, 31 Oct 2005 14:09:44 GMT]]></title><description><![CDATA[<p>SideWinder schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Das klingt nicht sonderlich brauchbar und ist imho nciht im Sinne des Erfinders.</p>
</blockquote>
<p>Könntest du das mal bitte begründen. Ich mache das bisher auch immer so und bin damit bisher gut gefahren. Vorallem, da</p>
<pre><code class="language-cpp">template&lt;class T&gt;
    Log&amp; operator &lt;&lt; (const T&amp; c)
    {
      os &lt;&lt; c;
      return *this;
    }
</code></pre>
<p>in diesem Fall nicht funktioniert, da T hier schlicht mehrdeutig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/904561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/904561</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 31 Oct 2005 14:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Mon, 31 Oct 2005 14:18:56 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>SideWinder schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Das klingt nicht sonderlich brauchbar und ist imho nciht im Sinne des Erfinders.</p>
</blockquote>
<p>Könntest du das mal bitte begründen. Ich mache das bisher auch immer so und bin damit bisher gut gefahren. Vorallem, da ... in diesem Fall nicht funktioniert, da T hier schlicht mehrdeutig ist.</p>
</blockquote>
<p>Also das mit der Mehrdeutigkeit von dem Template-T gehört wohl mit zum System und ich weiß nicht, wieso es nicht funktionieren sollte.</p>
<p>Wenn man für Manipulator-Funktionen überlädt, sollte man auch für den ganzen anderen Krams überladen (also ostream, string etc.). Letztlich halte ich</p>
<p>rrrrrrrrrrrrr schrieb:</p>
<blockquote>
<p>streambuf bauen</p>
</blockquote>
<p>für das Sinnvollste. Der Log-Stream ist schließlich auch nur ein Ausgabestream (zur Not halt ableiten, falls man irgendwelchen Zusatzkrams (Zeit o.ä.) brauch).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/904568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/904568</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 31 Oct 2005 14:18:56 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Mon, 31 Oct 2005 15:00:23 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Also das mit der Mehrdeutigkeit von dem Template-T gehört wohl mit zum System und ich weiß nicht, wieso es nicht funktionieren sollte.</p>
</blockquote>
<p>Wie bereits gesagt wurde hat endl (und die anderen Manipulatoren ohne Parameter) den Typ:</p>
<pre><code class="language-cpp">template &lt;class charT, class traits&gt;
  basic_ostream&lt;charT,traits&gt;&amp; endl( basic_ostream&lt;charT,traits&gt;&amp; os );
</code></pre>
<p>Es handelt sich also um ein *Template*. Ein Template passt nun aber nicht auf ein anderes Template. Es fehlen ja dabei die konkreten Typen mit denen man das Template instanziieren könnte. Und aus den Fingern saugt sich der Compiler keine Typen. Deshalb muss man den op&lt;&lt; für ein (oder mehrere) *konkrete* Manipulator-Typen überladen. Normalerweise reichen zwei (einmal für ostream und einmal für wostream).</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Wenn man für Manipulator-Funktionen überlädt, sollte man auch für den ganzen anderen Krams überladen (also ostream, string etc.).</p>
</blockquote>
<p>Verstehe nicht was du meinst. Es reicht doch ein operator&lt;&lt;-Template für die &quot;normalen&quot; Typen und ein bis zwei Überladungen für Manipulatoren.<br />
Was meinst du jetzt mit &quot;anderen Krams&quot;?</p>
<blockquote>
<p>Letztlich halte ich</p>
<p>rrrrrrrrrrrrr schrieb:</p>
<blockquote>
<p>streambuf bauen</p>
</blockquote>
<p>für das Sinnvollste.</p>
</blockquote>
<p>Prinzipiell eine gute Sache. Ist aber blöd, wenn man den LogStream auch zu einem Null-Overhead-NullStream machen möchte (d.h. z.B. im Release-Modus kein Logging). Das geht mit einem Streambuffer nicht, da die Formatierung vorher schon im Stream durchgeführt wurde.<br />
Hierfür habe ich z.B. ganz gerne den oben genannten Ansatz benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/904636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/904636</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 31 Oct 2005 15:00:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Mon, 31 Oct 2005 15:18:30 GMT]]></title><description><![CDATA[<p>Verstehe. Aber</p>
<pre><code class="language-cpp">log &lt;&lt; std::endl&lt;char, std::char_traits&lt;char&gt; &gt;;
</code></pre>
<p>klappt <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>Bzgl. Null-Overhead Nullstream: Macht man Debugging-Ausgaben im Normalfall nicht sowieso mit Makros, die bei NDEBUG rausfliegen, so wie asserts?</p>
<p>Wenn man Streams benutzen will, dann muss Log doch eigentlich auch ein ostream sein, sonst klappt z.B. das Aneinanderreihen nicht, ohne welches man auf den &lt;&lt;-Operator verzichten und das Logging mit einem Log-Streambuffer und einem Debug-Makro machen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/904656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/904656</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 31 Oct 2005 15:18:30 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Mon, 31 Oct 2005 19:08:49 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>SideWinder schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Das klingt nicht sonderlich brauchbar und ist imho nciht im Sinne des Erfinders.</p>
</blockquote>
<p>Könntest du das mal bitte begründen. Ich mache das bisher auch immer so und bin damit bisher gut gefahren. Vorallem, da ... in diesem Fall nicht funktioniert, da T hier schlicht mehrdeutig ist.</p>
</blockquote>
<p>Also das mit der Mehrdeutigkeit von dem Template-T gehört wohl mit zum System und ich weiß nicht, wieso es nicht funktionieren sollte.</p>
</blockquote>
<p>Hallo Filmor,</p>
<p>das ist interessant! Bei mir funktioniert</p>
<pre><code class="language-cpp">template&lt;class T&gt;
    Log&amp; operator &lt;&lt; (const T&amp; c)
</code></pre>
<p>in keinem Fall mit 'std::endl'. Egal welchen Compiler ich benutze (VC6, 7, 8, Comeau). Und warum ist das Überladen mit dem Manipulator nicht 'im Sinne des Erfinders'?</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Wenn man für Manipulator-Funktionen überlädt, sollte man auch für den ganzen anderen Krams überladen (also ostream, string etc.). Letztlich halte ich</p>
<p>rrrrrrrrrrrrr schrieb:</p>
<blockquote>
<p>streambuf bauen</p>
</blockquote>
<p>für das Sinnvollste. Der Log-Stream ist schließlich auch nur ein Ausgabestream (zur Not halt ableiten, falls man irgendwelchen Zusatzkrams (Zeit o.ä.) brauch).</p>
</blockquote>
<p>Ich verstehe hier überhaupt nicht, wie ein selbstgebauter Streambuf hier weiterhelfen soll. Kannst Du das bitte erläutern. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/904945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/904945</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 31 Oct 2005 19:08:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Tue, 01 Nov 2005 12:20:56 GMT]]></title><description><![CDATA[<p>Reicht es, wenn ich auf das verweise, was ich fast <strong>4 Stunden</strong> vor deinem Beitrag geschrieben hab?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/905627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/905627</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 01 Nov 2005 12:20:56 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Tue, 01 Nov 2005 13:16:39 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Reicht es, wenn ich auf das verweise, was ich fast <strong>4 Stunden</strong> vor deinem Beitrag geschrieben hab?</p>
</blockquote>
<p>Hallo Filmor,</p>
<p>um ehrlich zu sein; ich steh' etwa auf dem Schlauch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> . Du meinst wahrscheinlich Deinen Beitrag von 16:18:30 31.10.2005. Nun das compiliert zwar unter Comeau, aber für den VC8 ist es immer noch mehrdeutig. Darüber hinaus wäre es für mich auch keine Lösung statt 'endl' jedesmal 'std::endl&lt;char, std::char_traits&lt;char&gt; &gt;' zu schreiben.<br />
Ich würde auf jeden Fall meinen Vorschlag mit den operator für Manipulatoren bevorzugen.</p>
<p>Und warum auch nicht - und das ist das nächste was ich nicht verstehe - Du schriebst</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Wenn man für Manipulator-Funktionen überlädt, sollte man auch für den ganzen anderen Krams überladen (also ostream, string etc.).</p>
</blockquote>
<p>Warum sollte man dies tun, wenn die Template-Lösung dies alles erschägt?</p>
<p>Weiter schreibst Du</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Letztlich halte ich</p>
<p>rrrrrrrrrrrrr schrieb:</p>
<blockquote>
<p>streambuf bauen</p>
</blockquote>
<p>für das Sinnvollste. Der Log-Stream ist schließlich auch nur ein Ausgabestream (zur Not halt ableiten, falls man irgendwelchen Zusatzkrams (Zeit o.ä.) brauch).</p>
</blockquote>
<p>Die Frage ist letzlich, was der OP mit der Klasse Log letztlich bezwecken will. Ich kenne solche Konstruktionen, wenn man z.B. in Multi-Thread-Umgebungen ein Mutex locken möchte, welches die Ausgabe verschiedener Threads gegeneinander verriegelt, oder wenn vor jeder Ausgabe z.B. ein Timestamp mit rauskommen soll.<br />
Das oder ähnliches könnte eine Log-Klasse erledigen. Aber ein Streambuf ist dafür in keinen Fall die richtige Baustelle.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/905697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/905697</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 01 Nov 2005 13:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Tue, 01 Nov 2005 13:39:50 GMT]]></title><description><![CDATA[<p>Nun denn, zuerst einmal war das mit</p>
<pre><code class="language-cpp">log &lt;&lt; std::endl&lt;char, std::char_traits&lt;char&gt; &gt;;
</code></pre>
<p><strong>nicht</strong> ernst gemeint, daher der (eigentlich doch sehr geläufige) zwinkernde Smiley dahinter. Natürlich ist das nicht praktikabel.</p>
<p>Desweiteren meinte ich, dass man für eine echte Streamfunktionalität (und nur das macht es sinnvoll den Shiftoperator zu nutzen) einen ganzen Haufen an Operatoren überladen muss und dies daher imho genauso unpraktikabel ist wie das oben genannte Beispiel. Deshalb teile ich r13's Meinung, einen <strong>echten</strong> ostream zu nehmen und diesem einen gescheiten Logging-Streambuffer zu bauen.</p>
<p>Bezüglich des Overheads meinte ich dann, dass man diesen sowieso nur mit Debugging-Makros verhindern könnte und für diese die Streamsyntax nicht benutzbar ist.</p>
<p>Ich hoffe, ich konnte dich über meine Ansichten erleuchten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/905715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/905715</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 01 Nov 2005 13:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::endl on Tue, 01 Nov 2005 14:33:45 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Ich hoffe, ich konnte dich über meine Ansichten erleuchten.</p>
</blockquote>
<p>Ja konntest Du. Dank' Dir Filmor.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/905750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/905750</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 01 Nov 2005 14:33:45 GMT</pubDate></item></channel></rss>