<?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[Manipulatoren für Länge der Ausgabe]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne Manipulatoren einführen, um komfortabel festlegen zu können, wie ausführlich Objekte benutzerdefinierter Klassen ausgegeben werden sollen. Also wenn ich ein Objekt a der Klasse A habe, möchte ich</p>
<pre><code class="language-cpp">cout &lt;&lt; short &lt;&lt; a;
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">cout &lt;&lt; long &lt;&lt; a;
</code></pre>
<p>schreiben können.</p>
<p>Kann man das irgendwie realisieren, ohne eine eigene Klasse, die ostream erweitert, definieren zu müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/283203/manipulatoren-für-länge-der-ausgabe</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 17:13:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/283203.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Mar 2011 14:49:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Manipulatoren für Länge der Ausgabe on Mon, 07 Mar 2011 14:49:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne Manipulatoren einführen, um komfortabel festlegen zu können, wie ausführlich Objekte benutzerdefinierter Klassen ausgegeben werden sollen. Also wenn ich ein Objekt a der Klasse A habe, möchte ich</p>
<pre><code class="language-cpp">cout &lt;&lt; short &lt;&lt; a;
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">cout &lt;&lt; long &lt;&lt; a;
</code></pre>
<p>schreiben können.</p>
<p>Kann man das irgendwie realisieren, ohne eine eigene Klasse, die ostream erweitert, definieren zu müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030827</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Mon, 07 Mar 2011 14:49:36 GMT</pubDate></item><item><title><![CDATA[Reply to Manipulatoren für Länge der Ausgabe on Mon, 07 Mar 2011 15:04:09 GMT]]></title><description><![CDATA[<p>Du könntest so nen Manipulator bauen:</p>
<pre><code class="language-cpp">class A
{
private:
// ...

// friend für Templateklassen/Funktionen allgemein geht nicht, glaub ich
};

class manip&lt;typename C&gt;
{
private:
const A&amp; a_;
public:
A(const A&amp; a) : a_(a) {}
const A&amp; getA() const {return A_;}
};

template&lt;typename T&gt;
ostream&amp; operator&lt;&lt;(ostream&amp; os, const manip&lt;T&gt;&amp; obj) {}

// irgendwie spezialisieren
ostream&amp; operator&lt;&lt;(ostream&amp; os, const manip&lt;short&gt;&amp; obj)
{
os &lt;&lt; obj.getA().getAttrib();
return os;
}
</code></pre>
<p>Alles ungetestet. Aber wenn das klappt, ginge dann:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; manip&lt;short&gt;(a) &lt;&lt; manip&lt;long&gt;(a) &lt;&lt; '\n';
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2030830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030830</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 07 Mar 2011 15:04:09 GMT</pubDate></item><item><title><![CDATA[Reply to Manipulatoren für Länge der Ausgabe on Mon, 07 Mar 2011 15:03:28 GMT]]></title><description><![CDATA[<p>ingobulla schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>ich würde gerne Manipulatoren einführen, um komfortabel festlegen zu können, wie ausführlich Objekte benutzerdefinierter Klassen ausgegeben werden sollen. Also wenn ich ein Objekt a der Klasse A habe, möchte ich</p>
<pre><code class="language-cpp">cout &lt;&lt; short &lt;&lt; a;
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">cout &lt;&lt; long &lt;&lt; a;
</code></pre>
<p>schreiben können.</p>
<p>Kann man das irgendwie realisieren, ohne eine eigene Klasse, die ostream erweitert, definieren zu müssen?</p>
</blockquote>
<p>Ja. Du kannst Dir eigene Manipulatoren schreiben. Dafür musst Du ostream selbst nicht anfassen. Allerdings ist das kein ganz einfaches Thema, insbesonderes, wenn diese Parameter annehmen können sollen. Eine Suchmaschine hilft Dir weiter...</p>
<p>Und <a href="http://www.c-plusplus.net/forum/167423" rel="nofollow">hier</a> gibts einen Artikel im Forum dazu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030832</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 07 Mar 2011 15:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Manipulatoren für Länge der Ausgabe on Mon, 07 Mar 2011 15:09:03 GMT]]></title><description><![CDATA[<p>Hallo ingobulla,</p>
<p>so geht das:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct Foo // irgendeine Klasse
{
    Foo() : m_1(11), m_2(22), m_3(33) {}
    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const Foo&amp; foo );
private:
    int m_1, m_2, m_3; // irgendwelche Parameter
};

// --   global FOO_LENGTH-Index
namespace
{
    const int FOO_LENGTH = std::ios_base::xalloc();
}

// -- die Manipulatoren short_foo und long_foo setzen die 'Rucksackinformation'
std::ostream&amp; short_foo( std::ostream&amp; out )
{
    out.iword( FOO_LENGTH ) = 0;
    return out;
}
std::ostream&amp; long_foo( std::ostream&amp; out )
{
    out.iword( FOO_LENGTH ) = 47;
    return out;
}

// --   Die Ausgabefunktion liest die 'Rucksackinformation' aus dem ostream
std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const Foo&amp; foo )
{
    out &lt;&lt; foo.m_1; // die kurze Fassung
    if( out.iword( FOO_LENGTH ) &gt; 0 ) // Bem.: falls kein Manipulator vorher gerufen wurde, so ist der Wert =0
    {
        out &lt;&lt; &quot;; &quot; &lt;&lt; foo.m_2 &lt;&lt; &quot;; &quot; &lt;&lt; foo.m_3;
    }
    return out;
}

int main()
{
    using namespace std;
    Foo foo;
    cout &lt;&lt; &quot;kurz &quot; &lt;&lt; short_foo &lt;&lt; foo &lt;&lt; endl;
    cout &lt;&lt; &quot;lang &quot; &lt;&lt; long_foo &lt;&lt; foo &lt;&lt; endl;
    cout &lt;&lt; &quot;kurz &quot; &lt;&lt; short_foo &lt;&lt; foo &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Die Ausgabe hier wäre:</p>
<pre><code>kurz 11
lang 11; 22; 33
kurz 11
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030835</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 07 Mar 2011 15:09:03 GMT</pubDate></item></channel></rss>