<?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 Verhalten erweitern]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>für eine Logger-Klasse muss ich Zeilenumbrüche erkennen. Zuerst wollte ich einen Wrapper um <code>std::ostream</code> schreiben der mir die <code>operator&lt;&lt;</code> Aufrufe abfängt und die zwei Möglichkeiten ( <code>std::endl</code> und <code>\n</code> ) erkennt. Blöderweise komme ich dann an folgenden Punkt:</p>
<pre><code class="language-cpp">bool newline( std::ostream&amp; ( *manip ) (std::ostream&amp;) )
{
    return (manip == std::endl) ? true : false; // Wrong!
}
</code></pre>
<p>Aber natürlich ist <code>std::endl</code> eine Template-Funktion und keine &quot;Instanz&quot; deren Pointer ich vergleichen könnte. Wahrscheinlich ist das eine völlig falsche Herangehensweise.</p>
<p>Ich würde also gerne das <code>std::ostream</code> Verhalten erweitern, um Neuzeilen erkennen zu können. Jetzt kenn ich den Aufbau der C++ I/O Library aber nicht so wirklich, und wäre daher für jeden Hinweis dankbar was ich anpassen müsste. Ich denke ich müsste wohl <code>std::streambuf</code> austauschen, bin mir aber nicht sicher.</p>
<p>Schonmal vielen Dank im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262017/std-ostream-verhalten-erweitern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 22:46:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262017.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Feb 2010 11:05:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::ostream Verhalten erweitern on Sat, 27 Feb 2010 11:05:34 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>für eine Logger-Klasse muss ich Zeilenumbrüche erkennen. Zuerst wollte ich einen Wrapper um <code>std::ostream</code> schreiben der mir die <code>operator&lt;&lt;</code> Aufrufe abfängt und die zwei Möglichkeiten ( <code>std::endl</code> und <code>\n</code> ) erkennt. Blöderweise komme ich dann an folgenden Punkt:</p>
<pre><code class="language-cpp">bool newline( std::ostream&amp; ( *manip ) (std::ostream&amp;) )
{
    return (manip == std::endl) ? true : false; // Wrong!
}
</code></pre>
<p>Aber natürlich ist <code>std::endl</code> eine Template-Funktion und keine &quot;Instanz&quot; deren Pointer ich vergleichen könnte. Wahrscheinlich ist das eine völlig falsche Herangehensweise.</p>
<p>Ich würde also gerne das <code>std::ostream</code> Verhalten erweitern, um Neuzeilen erkennen zu können. Jetzt kenn ich den Aufbau der C++ I/O Library aber nicht so wirklich, und wäre daher für jeden Hinweis dankbar was ich anpassen müsste. Ich denke ich müsste wohl <code>std::streambuf</code> austauschen, bin mir aber nicht sicher.</p>
<p>Schonmal vielen Dank im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862005</guid><dc:creator><![CDATA[Tobias W]]></dc:creator><pubDate>Sat, 27 Feb 2010 11:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream Verhalten erweitern on Sat, 27 Feb 2010 11:35:43 GMT]]></title><description><![CDATA[<p>Eigentlich sollte doch</p>
<pre><code class="language-cpp">return (manip == '\n');
</code></pre>
<p>gehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862016</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sat, 27 Feb 2010 11:35:43 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream Verhalten erweitern on Sat, 27 Feb 2010 16:22:19 GMT]]></title><description><![CDATA[<p>Öhm nein, <code>manip</code> ist ein Funktionspointer. Den so zu vergleichen macht keinen Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862111</guid><dc:creator><![CDATA[Tobias W]]></dc:creator><pubDate>Sat, 27 Feb 2010 16:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream Verhalten erweitern on Sat, 27 Feb 2010 16:47:08 GMT]]></title><description><![CDATA[<p>Willst du std::endl vielleicht für deine Logger-Klasse überladen? Also</p>
<pre><code class="language-cpp">namespace std {
  template&lt;&gt; ::logger &amp;endl(::logger &amp;log) {
    // Zeug hier
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1862118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862118</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 27 Feb 2010 16:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to std::ostream Verhalten erweitern on Sat, 27 Feb 2010 20:21:24 GMT]]></title><description><![CDATA[<p>Das klingt schonmal recht sinnig <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>
<p>Aber <code>std::endl</code> könnte man bei meiner Implementierung immernoch übergeben, da ich keine Manipulatoren ausschließen möchte. Mal zur Erklärung: mein Logger gibt bei einem Write-Aufruf ein Ostream Wrapper Objekt zurück:</p>
<pre><code class="language-cpp">class OstreamWrapper
{
public:
    template &lt;typename T&gt;
    OstreamWrapper&amp; operator&lt;&lt;(const T &amp;data)
    { /* ... */ }

    OstreamWrapper&amp; operator&lt;&lt;(std::streambuf *buf)
    { /* ... */ }

    OstreamWrapper&amp; operator&lt;&lt;(std::ios&amp; ( *manip )(std::ios &amp;))
    { /* ... */ }

    OstreamWrapper&amp; operator&lt;&lt;(std::ostream&amp; ( *manip )(std::ostream &amp;))
    { /* ... */ }

    OstreamWrapper&amp; operator&lt;&lt;(std::ios_base&amp; ( *manip )(std::ios_base &amp;))
    { /* ... */ }
};
</code></pre>
<p>Damit kann man mit <code>operator&lt;&lt;</code> genauso arbeiten wie mit <code>std::ostream</code> . Der Wrapper schiebt die Daten (oder die Manipulatorfunktion) nur in den &quot;echten&quot; Stream, wenn das Logginglevel passt. Wenn ich jetzt <code>endl</code> für meinen Logger überlade, kann man trotzdem noch <code>std::endl</code> übergeben. Gleiche Problem wie vorher...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862161</guid><dc:creator><![CDATA[Tobias W]]></dc:creator><pubDate>Sat, 27 Feb 2010 20:21:24 GMT</pubDate></item></channel></rss>