<?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[eigene stream-manipulatoren mit parametern verwenden]]></title><description><![CDATA[<p>hallo leute,</p>
<p>ich versuche gerade einen stream manipulator zu schreiben, der eine zahl (dezimal) als dualzahl ausgibt. er soll mittels dem &amp;-operator überprüfen ob ein bit gesetzt ist oder nicht. bei manipulatoren ohne parameter schien mir das recht einfach, aber ich hab da mal was gelesen, dass man, wenn man sie mit parametern verwenden will, einen umweg über eine hilfsklasse gehen muss und irgendwelche funktionen casten muss etc. Das hab ich leider nicht verstanden und wollte fragen ob mir das hier im Forum jemand nochmal näherbringen könnte. Der Manipulator sollte diesselbe ausgabe wie diese funktion haben, nur sollte er die Ziffern eben direkt auf den ausgabestream schieben</p>
<pre><code class="language-cpp">const int BITS_PER_BYTE = 8;

template&lt;class T&gt;
std::string dual(T n, bool complete=true)//print in Dual
{
	std::stringstream s;
	size_t size = sizeof(n) * BITS_PER_BYTE;

	//nur datentypen kleiner oder gleich gross int zulassen
	if(size&gt;32)
		return &quot;&quot;;

	//Wenn erst ab dem ersten gesetzten Bit ausgegeben werden soll,
	//dann dieses erst suchen.
	while(!complete &amp;&amp; !(n &amp; 1&lt;&lt; size-1))
		--size;

	for(int i = size -1; i&gt;=0; --i)
		//in einen boolschen ausdruck konvertieren und dann in den stream schieben
		s&lt;&lt;((n &amp; 1&lt;&lt;i) != 0);

	return s.str();
}
</code></pre>
<p>Vielen Dank schonmal im Voraus <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/topic/182875/eigene-stream-manipulatoren-mit-parametern-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 02:04:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182875.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 May 2007 09:52:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 09:52:36 GMT]]></title><description><![CDATA[<p>hallo leute,</p>
<p>ich versuche gerade einen stream manipulator zu schreiben, der eine zahl (dezimal) als dualzahl ausgibt. er soll mittels dem &amp;-operator überprüfen ob ein bit gesetzt ist oder nicht. bei manipulatoren ohne parameter schien mir das recht einfach, aber ich hab da mal was gelesen, dass man, wenn man sie mit parametern verwenden will, einen umweg über eine hilfsklasse gehen muss und irgendwelche funktionen casten muss etc. Das hab ich leider nicht verstanden und wollte fragen ob mir das hier im Forum jemand nochmal näherbringen könnte. Der Manipulator sollte diesselbe ausgabe wie diese funktion haben, nur sollte er die Ziffern eben direkt auf den ausgabestream schieben</p>
<pre><code class="language-cpp">const int BITS_PER_BYTE = 8;

template&lt;class T&gt;
std::string dual(T n, bool complete=true)//print in Dual
{
	std::stringstream s;
	size_t size = sizeof(n) * BITS_PER_BYTE;

	//nur datentypen kleiner oder gleich gross int zulassen
	if(size&gt;32)
		return &quot;&quot;;

	//Wenn erst ab dem ersten gesetzten Bit ausgegeben werden soll,
	//dann dieses erst suchen.
	while(!complete &amp;&amp; !(n &amp; 1&lt;&lt; size-1))
		--size;

	for(int i = size -1; i&gt;=0; --i)
		//in einen boolschen ausdruck konvertieren und dann in den stream schieben
		s&lt;&lt;((n &amp; 1&lt;&lt;i) != 0);

	return s.str();
}
</code></pre>
<p>Vielen Dank schonmal im Voraus <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/1295033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295033</guid><dc:creator><![CDATA[rudi++]]></dc:creator><pubDate>Wed, 30 May 2007 09:52:36 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 10:04:20 GMT]]></title><description><![CDATA[<p>Hi, willste sowas wie das hier:</p>
<pre><code class="language-cpp">cout &lt;&lt; dual &lt;&lt; meinZahl;
</code></pre>
<p>oder sowas:</p>
<pre><code class="language-cpp">cout &lt;&lt; dual(meinZahl); // &lt;&lt;- das hast du ja schon
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1295038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295038</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 30 May 2007 10:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 10:59:31 GMT]]></title><description><![CDATA[<p>Ganz grob mal:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;bitset&gt;

template&lt; typename _CharT, typename _Traits &gt;
class my_ostream : private std::basic_ostream&lt; _CharT, _Traits &gt;
{
public:
	explicit my_ostream( std::basic_streambuf&lt;_CharT, _Traits&gt;* __sb )
		: std::basic_ostream&lt; _CharT, _Traits &gt;( __sb )
		, flags( 0 )
	{}

	std::basic_ostream&lt; _CharT, _Traits &gt;&amp; my_ostream&lt; _CharT, _Traits &gt;::operator&lt;&lt;( long __n )
	{
		if ( flags ) // flags prüfen
		{
			return ( ( *this ) &lt;&lt; std::bitset&lt; 32 &gt;( __n ) );
		}
		else
			return std::basic_ostream&lt; _CharT, _Traits &gt;::operator&lt;&lt;( __n );
	}

	void setflags( unsigned long v )
	{
		flags |= v;
	}

private:
	unsigned long flags;
};

struct dual_t
{};

template&lt; typename _CharT, typename _Traits &gt;
my_ostream&lt; _CharT, _Traits&gt;&amp; operator&lt;&lt;( my_ostream&lt; _CharT, _Traits&gt;&amp; out, const dual_t&amp; manipulator )
{
	out.setflags( 1 );
	return out;
}

static const dual_t dual = dual_t();

int main()
{
	my_ostream&lt; char, std::char_traits&lt; char &gt; &gt; stream( std::cout.rdbuf() );
	stream &lt;&lt; dual &lt;&lt; 234;
}
</code></pre>
<p>So ähnlich sollt das funktionieren. Allerdings <strong>nicht</strong> mit dem Standard ostream da dieser keinen Flags für das duale Zahlensystem hat. Mir würd zumindest spontan keine Lösung einfallen das auf dem herkömmlichen Weg zu lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295057</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 30 May 2007 10:59:31 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 11:10:24 GMT]]></title><description><![CDATA[<p>@ KasF: Wenn ersteres möglich wäre wärs natürlich spitze, aber ich geb mit auch mit dem zweiten zufrieden, wobei das ja, zumindest so wie ichs hatte, noch KEIN manipulator war.</p>
<p>@ David_pb: Vielen dank für den Code. Ich werd ihn mal durchgehen, da ichs beim ersten überfligen noch nicht ganz kapiert habe. ich schau auch mal, ob ich die oben erwähnte beschreibung nochmal wiederfinde, denn ich glaub' da gings mit der klasse ostream, bin mir aber nicht mehr sicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295071</guid><dc:creator><![CDATA[rudi++]]></dc:creator><pubDate>Wed, 30 May 2007 11:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 11:59:16 GMT]]></title><description><![CDATA[<p>Hi,<br />
hier noch ein Ansatz mit einem &quot;echten&quot; Manipulator mit Argument und &quot;richtigem&quot; ostream (Idee stammt aus &quot;Die C++ Programmiersprache&quot;).<br />
Ich habe übrigens aus deinem Templateparameter T ein int gemacht, um Tipparbeit zu sparen, es geht aber natürlich auch mit Templates.</p>
<pre><code class="language-cpp">struct manip
{
    std::ostream&amp; (*f)(std::ostream&amp;, int, bool);
    int n;
    bool complete;

    manip(std::ostream&amp; (*f_)(std::ostream&amp;, int, bool), int n_, bool complete_)
        : f(f_), n(n_), complete(complete_)
    { }
};

const int BITS_PER_BYTE = 8;
std::ostream&amp; dual_(std::ostream&amp; os, int n, bool complete)//print in dual
{ 
    size_t size = sizeof(n) * BITS_PER_BYTE; 

    //nur datentypen kleiner oder gleich gross int zulassen 
    if(size&gt;32) 
        return os;

    //Wenn erst ab dem ersten gesetzten Bit ausgegeben werden soll, 
    //dann dieses erst suchen. 
    while(!complete &amp;&amp; !(n &amp; 1&lt;&lt; size-1)) 
        --size; 

    for(int i = size -1; i&gt;=0; --i) 
        //in einen boolschen ausdruck konvertieren und dann in den stream schieben 
        os&lt;&lt;((n &amp; 1&lt;&lt;i) != 0); 

    return os; 
}

manip dual(int n, bool complete=true)
{
    return manip( dual_, n, complete );
}

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, manip m)
{
    return m.f( os, m.n, m.complete );
}

int main()
{
    std::cout &lt;&lt; dual(255,true) &lt;&lt; std::endl;
}
</code></pre>
<p>Erklärung:<br />
Die neue Funktion <code>dual</code> setzt du wie einen Manipulator ein. Sie erzeugt eine Variable vom Typ <code>manip</code> , die drei Member hat:</p>
<ul>
<li>einen Funktionspointer <code>f</code> , der auf eine Funktion zeigt, die einen Stream manipuliert; hier zeigt er also auf <code>dual_</code></li>
<li>ein Integer <code>n</code> ; er dient zur Speicherung des ersten Arguments von <code>dual</code></li>
<li>ein Bool <code>complete</code> ; dient ebenfalls zur Speicherung</li>
</ul>
<p>Diese <code>manip</code> -Variable wird nun mit dem <code>operator&lt;&lt;</code> ausgegeben. In dieser Funktion wird die Funktion, auf die der Funktionszeiger in m zeigt (also hier <code>dual_</code> ), mit den entsprechenden Argumenten aufgerufen.</p>
<p><code>dual_</code> wurde nur so verändert, dass sie in den übergebenen ostream schreibt, statt in einen stringstream.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295120</guid><dc:creator><![CDATA[michba]]></dc:creator><pubDate>Wed, 30 May 2007 11:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:07:12 GMT]]></title><description><![CDATA[<p>Wenn dus so lösen willst brauchst du dir nich so einen Umstand machen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;bitset&gt;
#include &lt;string&gt;

std::string dual( int i )
{
	return std::bitset&lt; 32 &gt;( i ).template to_string&lt; char, std::char_traits&lt; char &gt;, std::allocator&lt; char &gt; &gt;();
}

int main()
{
	std::cout &lt;&lt; dual( 1234 ) &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1295129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295129</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 30 May 2007 12:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:15:29 GMT]]></title><description><![CDATA[<p>@ michba: Besten Dank für die Antwort! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /><br />
Genau sowas hatte ich gemeint. Zusammen mit der Erklärung werd ichs wohl in den Griff bekommen</p>
<p>@ david_pb: ja sieht mir einfacher aus als mein vorschlag, aber leider gibt die funktion nur n string zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295141</guid><dc:creator><![CDATA[rudi++]]></dc:creator><pubDate>Wed, 30 May 2007 12:15:29 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:16:15 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Wenn dus so lösen willst brauchst du dir nich so einen Umstand machen.</p>
</blockquote>
<p>Der &quot;Umstand&quot; ja nur deswegen, damit er direkt in einen Stream schreiben kann. Aber hast schon recht, wenn man ein Manipulator mit Argumenten braucht, dann tuts ein std::string dual(...) am besten und einfachsten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295143</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 30 May 2007 12:16:15 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:20:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10754">@David_pb</a><br />
Das ist aber strenggenommen kein Manipulator, sondern eine &quot;einfache&quot; Funktion.<br />
Wie sinnvoll es ist, dieses &quot;Dezimal nach Dual&quot; als Manipulator zu implementieren, sei jetzt mal dahingestellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295147</guid><dc:creator><![CDATA[michba]]></dc:creator><pubDate>Wed, 30 May 2007 12:20:51 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:22:34 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>David_pb schrieb:</p>
<blockquote>
<p>Wenn dus so lösen willst brauchst du dir nich so einen Umstand machen.</p>
</blockquote>
<p>Der &quot;Umstand&quot; ja nur deswegen, damit er direkt in einen Stream schreiben kann. Aber hast schon recht, wenn man ein Manipulator mit Argumenten braucht, dann tuts ein std::string dual(...) am besten und einfachsten.</p>
</blockquote>
<p>NEIN, das ist K-E-I-N manipulator!<br />
das ist deshalb wichtig, da daraus später noch sowas wie std::hex wird und zeig mir mal wie du cout mit einem string verändern willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295148</guid><dc:creator><![CDATA[rudi++]]></dc:creator><pubDate>Wed, 30 May 2007 12:22:34 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:27:35 GMT]]></title><description><![CDATA[<p>rudi++ schrieb:</p>
<blockquote>
<p>NEIN, das ist K-E-I-N manipulator!</p>
</blockquote>
<p>Das ist mir schon klar, lies meinen Satz nochmal und verstehe ihn anders <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>rudi++ schrieb:</p>
<blockquote>
<p>zeig mir mal wie du cout mit einem string verändern willst.</p>
</blockquote>
<p>Was meinst du damit ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295157</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 30 May 2007 12:27:35 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:39:38 GMT]]></title><description><![CDATA[<p>rudi++ schrieb:</p>
<blockquote>
<p>das ist deshalb wichtig, da daraus später noch sowas wie std::hex wird und zeig mir mal wie du cout mit einem string verändern willst.</p>
</blockquote>
<p>Was genau meinst du damit? <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="😉"
    /> Ich seh da kein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295167</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 30 May 2007 12:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:44:45 GMT]]></title><description><![CDATA[<p>er meint</p>
<pre><code class="language-cpp">std::cout &lt;&lt; std::hex &lt;&lt; dual(...);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1295174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295174</guid><dc:creator><![CDATA[............]]></dc:creator><pubDate>Wed, 30 May 2007 12:44:45 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:50:03 GMT]]></title><description><![CDATA[<pre><code>std::cout&lt;&lt;std::hex&lt;&lt;123456&lt;&lt;654321&lt;&lt;std::endl;
</code></pre>
<pre><code>std::cout&lt;&lt;dual(123456)&lt;&lt;654321&lt;&lt;std::endl;
</code></pre>
<p>(dual gibt hiern nen String zurück.)<br />
beim ersten werden alle zahlen, die man in den stream schiebt in hexadezimaler schreibweise ausgegeben, beim zweiten wird nur die ausgabe der ersten zahl verändert. ich wollt deshalb sowas wie std::hex basteln, bei dem dann auch alle nachfolgenden zahlen in binärform ausgegeben werden.</p>
<pre><code>std::cout&lt;&lt;dual&lt;&lt;0xff&lt;&lt;std::endl&lt;&lt;0x0f&lt;&lt;std::endl;
</code></pre>
<p>ausgabe:</p>
<blockquote>
<p>11111111<br />
00001111</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1295179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295179</guid><dc:creator><![CDATA[rudi++]]></dc:creator><pubDate>Wed, 30 May 2007 12:50:03 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 12:56:14 GMT]]></title><description><![CDATA[<p>Also das wird schwierig, weil du dazu in die Ausgaberoutinen für int-Werte eingreifen müsstest - und die Standard-Streams sind nicht darauf ausgelegt, Zahlen binär auszugeben. (der richtige Angriffspunkt wäre der <code>ostream::operator&lt;&lt;(int)</code> , aber den solltest du als Programmierer nicht angreifen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295184</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 30 May 2007 12:56:14 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 13:24:07 GMT]]></title><description><![CDATA[<p>Das wird nich gehen weil sich der Stream ja merken müsst das du dich im dualen &quot;Modus&quot; befindest. Das geht beim std::hex Manipulator über Flags die gesetzt werden, die aber schon standardmäßig vom std::basic_ios angeboten werden. Da Dualzahlen aber <strong>nicht</strong> im Repertoire von std::ostream zu finden sind wirst dus nicht so einfach hinbekommen.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295186</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 30 May 2007 13:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to eigene stream-manipulatoren mit parametern verwenden on Wed, 30 May 2007 13:19:03 GMT]]></title><description><![CDATA[<p>Alles schon gesagt, benutz das was dir am liebsten ist <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/1295216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295216</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 30 May 2007 13:19:03 GMT</pubDate></item></channel></rss>