<?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[operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren]]></title><description><![CDATA[<p>Hiho</p>
<p>ich habe eine Klasse geschrieben, für die ich den Ausgabeoperator überladen habe (und weitere Manipulatoren, im Beispiel <code>manip</code> ), so dass man sie wie <code>cout</code> verwenden kann.</p>
<pre><code class="language-cpp">class MyCout
{
  // ...
};
template&lt;typename T&gt;
inline MyCout&amp; operator&lt;&lt;(MyCout&amp; c, T d)
{
  std::cout &lt;&lt; d;
  return (c);
}

inline MyCout&amp; operator&lt;&lt;(MyCout&amp; c, MyCout&amp; (*pfn)(MyCout&amp;))
{
  pfn(c);
  return (c);
}

inline MyCout&amp; manip(MyCout&amp; c)
{
  if(c.testSomething())
    c &lt;&lt; &quot;foobar&quot;;
  return (c);
}
</code></pre>
<p>Damit geht dann z.B. sowas:</p>
<pre><code class="language-cpp">MyCout mc;
mc &lt;&lt; &quot;Hallo! &quot; &lt;&lt; 42 &lt;&lt; manip;
</code></pre>
<p>Allerdings funktioniert ein</p>
<pre><code class="language-cpp">MyCout mc;
mc &lt;&lt; endl;
</code></pre>
<p>natürlich nicht mehr. Kennt jemand einen Weg, wie ich diese Funktionilät möglichst ohne großen Aufwand an &quot;cout&quot; delegieren kann (obwohl ich mit <code>MyCout</code> -Objekten arbeite), so dass also o.g. Beispiel dennoch funktioniert?</p>
<p>Greetings! <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/289634/operator-lt-lt-definieren-funktionalität-an-cout-delegieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 02:53:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289634.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Jul 2011 19:46:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 19:46:43 GMT]]></title><description><![CDATA[<p>Hiho</p>
<p>ich habe eine Klasse geschrieben, für die ich den Ausgabeoperator überladen habe (und weitere Manipulatoren, im Beispiel <code>manip</code> ), so dass man sie wie <code>cout</code> verwenden kann.</p>
<pre><code class="language-cpp">class MyCout
{
  // ...
};
template&lt;typename T&gt;
inline MyCout&amp; operator&lt;&lt;(MyCout&amp; c, T d)
{
  std::cout &lt;&lt; d;
  return (c);
}

inline MyCout&amp; operator&lt;&lt;(MyCout&amp; c, MyCout&amp; (*pfn)(MyCout&amp;))
{
  pfn(c);
  return (c);
}

inline MyCout&amp; manip(MyCout&amp; c)
{
  if(c.testSomething())
    c &lt;&lt; &quot;foobar&quot;;
  return (c);
}
</code></pre>
<p>Damit geht dann z.B. sowas:</p>
<pre><code class="language-cpp">MyCout mc;
mc &lt;&lt; &quot;Hallo! &quot; &lt;&lt; 42 &lt;&lt; manip;
</code></pre>
<p>Allerdings funktioniert ein</p>
<pre><code class="language-cpp">MyCout mc;
mc &lt;&lt; endl;
</code></pre>
<p>natürlich nicht mehr. Kennt jemand einen Weg, wie ich diese Funktionilät möglichst ohne großen Aufwand an &quot;cout&quot; delegieren kann (obwohl ich mit <code>MyCout</code> -Objekten arbeite), so dass also o.g. Beispiel dennoch funktioniert?</p>
<p>Greetings! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2090753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090753</guid><dc:creator><![CDATA[FooMan]]></dc:creator><pubDate>Sat, 09 Jul 2011 19:46:43 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 19:52:24 GMT]]></title><description><![CDATA[<p>Du könntest &quot;manip&quot; in einen Funktor packen, dann kannst du auch gezielt dafür eine Überladung schreiben.</p>
<p>PS: Was ist eigentlich der Sinn der Aktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090754</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Jul 2011 19:52:24 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 20:01:59 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Du könntest &quot;manip&quot; in einen Funktor packen, dann kannst du auch gezielt dafür eine Überladung schreiben.</p>
</blockquote>
<p>Könntest Du (vllt. in Codeform) andeuten, wie Du das meinst? Kanns mir nicht ganz vorstellen...</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>PS: Was ist eigentlich der Sinn der Aktion?</p>
</blockquote>
<p>Farbige Ausgabe auf der Konsole. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2090759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090759</guid><dc:creator><![CDATA[FooMan]]></dc:creator><pubDate>Sat, 09 Jul 2011 20:01:59 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 20:11:26 GMT]]></title><description><![CDATA[<p>FooMan schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Du könntest &quot;manip&quot; in einen Funktor packen, dann kannst du auch gezielt dafür eine Überladung schreiben.</p>
</blockquote>
<p>Könntest Du (vllt. in Codeform) andeuten, wie Du das meinst? Kanns mir nicht ganz vorstellen...</p>
</blockquote>
<p>Nur grob angedeutet:</p>
<pre><code class="language-cpp">class manip_t
{
  ...
};
extern manip_t manip;

MyCout operator&lt;&lt;(MyCout&amp; stream, const manip_t&amp; manip)
{
  //mach was mit dem Stream
  return stream;
}
</code></pre>
<p>Da kannst du den Manipulator-Typ entweder als Dummy verwenden, um genau diese Operator-Überladung auszuwählen, oder du gibst der Klasse noch einen Konstruktor, um dir noch ein paar zusätzliche Daten mitzugeben (z.B. die zu verwendende Farbe).</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>PS: Was ist eigentlich der Sinn der Aktion?</p>
</blockquote>
<p>Farbige Ausgabe auf der Konsole. <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>
</blockquote>
<p>Klingt interessant.<br />
Eventuell wäre es ja sogar möglich, dafür einen Manipulator zu schreiben, der direkt auf einen normalen Stream angewendet werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090765</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Jul 2011 20:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 20:18:58 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>FooMan schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Du könntest &quot;manip&quot; in einen Funktor packen, dann kannst du auch gezielt dafür eine Überladung schreiben.</p>
</blockquote>
<p>Könntest Du (vllt. in Codeform) andeuten, wie Du das meinst? Kanns mir nicht ganz vorstellen...</p>
</blockquote>
<p>Nur grob angedeutet:</p>
<pre><code class="language-cpp">class manip_t
{
  ...
};
extern manip_t manip;

MyCout operator&lt;&lt;(MyCout&amp; stream, const manip_t&amp; manip)
{
  //mach was mit dem Stream
  return stream;
}
</code></pre>
<p>Da kannst du den Manipulator-Typ entweder als Dummy verwenden, um genau diese Operator-Überladung auszuwählen, oder du gibst der Klasse noch einen Konstruktor, um dir noch ein paar zusätzliche Daten mitzugeben (z.B. die zu verwendende Farbe).</p>
</blockquote>
<p>Aber wie genau erlaubt mir das jetzt, meine Klasse ( <code>MyCout</code> ) für die Verwendung der Standardmanipulatoren (setfill,endl,hex,...) fitt zu machen? Die Brücke fehlt mir noch... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090772</guid><dc:creator><![CDATA[FooMan]]></dc:creator><pubDate>Sat, 09 Jul 2011 20:18:58 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 20:22:25 GMT]]></title><description><![CDATA[<p>Dieser Operator wird nur für diesen Manipulator vom Compiler ausgewählt, alles andere landet in deinem obigen Template-Operator (und wird damit direkt weitergeleitet an die regulären Stream-Operatoren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090775</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Jul 2011 20:22:25 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 20:27:33 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Dieser Operator wird nur für diesen Manipulator vom Compiler ausgewählt, alles andere landet in deinem obigen Template-Operator (und wird damit direkt weitergeleitet an die regulären Stream-Operatoren).</p>
</blockquote>
<p>Da ich aber für jede Farbe einen solchen Manipulator (so wie manip) habe, müsste ich das dann auch für alle Manipulatoren tun, richtig? Das wäre dann halt sehr viel Schreibarbeit ... oder ich verstehe Dich noch nicht ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090776</guid><dc:creator><![CDATA[FooMan]]></dc:creator><pubDate>Sat, 09 Jul 2011 20:27:33 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 20:34:29 GMT]]></title><description><![CDATA[<p>Unterscheidet sich denn die prinzipielle Funktionsweise dahingehend, welche Farbe du verwenden willst? Wenn nicht, reicht eine Manipulator-Klasse, die du mit Parameter aufrufen kannst:</p>
<pre><code class="language-cpp">class color
{
  unsigned farbe;
public:
  color(unsigned f) : farbe(f) {}
  unsigned getColor() const { return farbe; }
};

MyCout operator&lt;&lt;(MyCout&amp; stream, color f)
{
  ...
}

//optional, wenn dir die Direkt-Angabe zu aufwendig ist
color red  (0x00FF0000);
color green(0x0000FF00);
color blue (0x000000FF);
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2090783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090783</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Jul 2011 20:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 20:50:08 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Unterscheidet sich denn die prinzipielle Funktionsweise dahingehend, welche Farbe du verwenden willst? [...]</p>
</blockquote>
<p>Nein, stimmt. Wenn ich das allerdings so implementiere und es wie folgt teste:</p>
<pre><code class="language-cpp">MyCout mc;
mc &lt;&lt; color(&quot;\033[22;31m&quot;) &lt;&lt; &quot;Hallo&quot; &lt;&lt; endl;
</code></pre>
<p>...meldet der Compiler:</p>
<pre><code>Main.cpp:60:46: Fehler: no match for »operator&lt;&lt;« in »gfxout::operator&lt;&lt; [with T = const char*]((* &amp; gfxout::operator&lt;&lt;((* &amp; mc), gfxout::color((* &amp; std::basic_string&lt;char&gt;(((const char*)&quot;\033[22;31m&quot;), (*(const std::allocator&lt;char&gt;*)(&amp; std::allocator&lt;char&gt;()))))))), ((const char*)&quot;Hallo&quot;)) &lt;&lt; std::endl«
</code></pre>
<p>...ohne <code>endl</code> funktioniert es ( <code>gfxout</code> ist ein namespace). Meine Ausgabe-Operatoren sind nur die beiden:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
inline MyCout&amp; operator&lt;&lt;(MyCout&amp; c, T d)
{
  std::cout &lt;&lt; d;
  return (c);
}

inline MyCout&amp; operator&lt;&lt;(MyCout&amp; s, color f)
{
	return (s &lt;&lt; f.getColor());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2090796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090796</guid><dc:creator><![CDATA[FooMan]]></dc:creator><pubDate>Sat, 09 Jul 2011 20:50:08 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 21:00:01 GMT]]></title><description><![CDATA[<p>Mal eine Randfrage: Brauchst du dazu überhaupt eine eigene Dummy-Klasse MyCout? Wenn nicht, würde ich nur die Color-Klasse definieren und ihren Stream-Operator passend überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090802</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Jul 2011 21:00:01 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 21:04:25 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Mal eine Randfrage: Brauchst du dazu überhaupt eine eigene Dummy-Klasse MyCout? Wenn nicht, würde ich nur die Color-Klasse definieren und ihren Stream-Operator passend überladen.</p>
</blockquote>
<p>Hatte ich auch schon überlegt, aber leider ja: Ich möchste halt <code>mc &lt;&lt; red &lt;&lt; &quot;Hallo&quot; &lt;&lt; endl;</code> schreiben können vorher einmal, bei Erzeugung von <code>mc</code> sagen, &quot;Farben an&quot; oder &quot;Farben aus&quot;. Wenn Farben ausgestellt sind, wird das &quot;red&quot; einfach ignoriert. Man könnte das mit globalen Variablen lösen, aber das finde ich unschön...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090806</guid><dc:creator><![CDATA[FooMan]]></dc:creator><pubDate>Sat, 09 Jul 2011 21:04:25 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 21:13:49 GMT]]></title><description><![CDATA[<p>Da würde ich einen idealen Einsatz für die Zusatzflags der Streams sehen:</p>
<pre><code class="language-cpp">static const int colorflag_index = std::ios_base::xalloc();

std::ostream&amp; color_on(std::ostream&amp; stream)
{
  stream.iword(colorflag_index) = true;
  return stream;
}

std::ostream&amp; color_off(std::ostream&amp; stream)
{
  stream.iword(colorflag_index) = false;
  return stream;
}

std:.ostream&amp; operator&lt;&lt;(std::ostream&amp; stream, color c)
{
  if(stream.iword(colorflag_index))
    stream&lt;&lt;c.getCode();
  return stream;
}
</code></pre>
<p>Damit kannst du sogar für jeden Stream einzeln festlegen, ob er Farben verwenden soll - wenn du nichts angibst, sind sie per Default abgeschaltet. Und mit einem <code>cout&lt;&lt;color_on;</code> schaltest du die Farb-Darstellung ein, wenn du sie benötigst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090807</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Jul 2011 21:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; definieren + Funktionalität an cout delegieren on Sat, 09 Jul 2011 21:31:17 GMT]]></title><description><![CDATA[<p>Perfekt, vielen-vielen Dank! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090812</guid><dc:creator><![CDATA[FooMan]]></dc:creator><pubDate>Sat, 09 Jul 2011 21:31:17 GMT</pubDate></item></channel></rss>