<?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 flags zu eigenen datentypen?]]></title><description><![CDATA[<p>hallo</p>
<p>ich habe eine klasse, für welche einen operator&lt;&lt; (ostream, class) definiert ist. kann ich nun auch meine eigenen flags dafür definieren? und wenn ja, wie?</p>
<p>kurzes beispiel was ich schlussendlich möglicherweise schreiben möchte:</p>
<pre><code>std::cout &lt;&lt; mylib::decimal &lt;&lt; data;
std::ofstream file(&quot;test.dat&quot;);
file &lt;&lt; mylib::binary &lt;&lt; data;
</code></pre>
<p>ich kann ja die stream-objekte (ofstream, ostream usw) ja nicht selbst bearbeiten, daher kommt mir aktuell keine gute idee dazu...</p>
<p>gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320101/eigene-flags-zu-eigenen-datentypen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 12:07:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320101.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Sep 2013 10:19:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 10:19:31 GMT]]></title><description><![CDATA[<p>hallo</p>
<p>ich habe eine klasse, für welche einen operator&lt;&lt; (ostream, class) definiert ist. kann ich nun auch meine eigenen flags dafür definieren? und wenn ja, wie?</p>
<p>kurzes beispiel was ich schlussendlich möglicherweise schreiben möchte:</p>
<pre><code>std::cout &lt;&lt; mylib::decimal &lt;&lt; data;
std::ofstream file(&quot;test.dat&quot;);
file &lt;&lt; mylib::binary &lt;&lt; data;
</code></pre>
<p>ich kann ja die stream-objekte (ofstream, ostream usw) ja nicht selbst bearbeiten, daher kommt mir aktuell keine gute idee dazu...</p>
<p>gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352904</guid><dc:creator><![CDATA[doktor banane]]></dc:creator><pubDate>Mon, 16 Sep 2013 10:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 10:34:11 GMT]]></title><description><![CDATA[<p>Geht im Prinzip genau so wie vorher. Wenn man erst einmal weiß, was dahinter steckt, ist es ganz einfach:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

ostream&amp; manipulator_ohne_parameter(ostream&amp; os)
{
    // Dein Code hier.
    // Zum Beispiel:
    os &lt;&lt; &quot;Foo!\n&quot;;
    return os;
}

class manipulator_mit_parameter
{
    int data;
public:
    manipulator_mit_parameter(int data): data(data){}
    friend ostream &amp;operator&lt;&lt;(ostream &amp;os, manipulator_mit_parameter man)
    {
        // Dein Code hier.
        // Zum Beispiel:
        os &lt;&lt; &quot;Bar(&quot; &lt;&lt; man.data &lt;&lt; &quot;)\n&quot;;
        return os;
    }
};

int main()
{
    cout &lt;&lt; manipulator_ohne_parameter &lt;&lt; manipulator_mit_parameter(5);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2352910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352910</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 16 Sep 2013 10:34:11 GMT</pubDate></item><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 10:48:44 GMT]]></title><description><![CDATA[<p>Und es ist auch richtig, dass der Parameter per value übergeben wird? In dem Fall in Zeile 17 das <em>manipulator_mit_parameter</em> Objekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352912</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 16 Sep 2013 10:48:44 GMT</pubDate></item><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 10:53:47 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Und es ist auch richtig, dass der Parameter per value übergeben wird? In dem Fall in Zeile 17 das <em>manipulator_mit_parameter</em> Objekt?</p>
</blockquote>
<p>Was soll daran falsch sein? Es ist im Gegenteil gut, da <code>manipulator_mit_parameter</code> nur <code>sizeof(int)</code> groß sein wird... man übergibt nur per Referenz bei Klassen mit teurem Kopierkonstruktor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352914</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 16 Sep 2013 10:53:47 GMT</pubDate></item><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 11:02:13 GMT]]></title><description><![CDATA[<p>danke für die schnelle antworten.<br />
ich bin mir nun nicht ganz sicher ob wir wirklich vom gleichen reden. ich würde ja gerne mit dem manipulator selbst noch nichts ausgeben, sondern lediglich bestimmen, wie das nächste, das ausgegeben wird, aussehen soll.</p>
<p>ich poste mal meinen bisherigen schlechten löchrigen ansatz: (steinigt mich nicht dafür)</p>
<pre><code>#include &lt;map&gt;
#include &lt;iostream&gt;
namespace mylib
{
	enum visual
	{
		v_binary,
		v_decimal
	};
}
namespace
{
	::std::map&lt; std::ostream const*, mylib::visual&gt; _association;
}
namespace mylib
{
	template&lt;visual _v&gt;
	struct manip
	{
		const static visual v = _v;
	};
	const manip&lt;v_binary&gt; binary;
	const manip&lt;v_decimal&gt; decimal;
	template&lt;visual _v&gt;
	::std::ostream&amp; operator&lt;&lt; (::std::ostream&amp; os, manip&lt;_v&gt; const&amp; manipulator)
	{
		::_association[&amp;os] = manipulator.v;
		return os;
	}
	class storage
	{
		char _c;
	public:
		storage(char c = 0) : _c(c) {}
		void set(char c) { _c = c; }
		char get() const { return _c; }
	};
	::std::ostream&amp; operator&lt;&lt; (::std::ostream&amp; os, storage const&amp; data)
	{
		if(::_association[&amp;os] == v_binary)
		{
			os &lt;&lt; data.get();
		}
		else if(::_association[&amp;os] == v_decimal)
		{
			os &lt;&lt; static_cast&lt;int&gt;(data.get());
		}
		else
		{
			// enum-exception
		}
		return os;
	}
}
int main()
{
	mylib::storage inst('h');
	std::cout &lt;&lt; mylib::binary &lt;&lt; inst &lt;&lt; '\n';
	std::cout &lt;&lt; mylib::decimal &lt;&lt; inst &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2352917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352917</guid><dc:creator><![CDATA[doktor banane]]></dc:creator><pubDate>Mon, 16 Sep 2013 11:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 11:04:20 GMT]]></title><description><![CDATA[<p>nachtrag:</p>
<p>resultat:<br />
<a href="http://ideone.com/m1yJ25" rel="nofollow">http://ideone.com/m1yJ25</a></p>
<blockquote>
<p>stdout<br />
h<br />
104</p>
</blockquote>
<p>zusätzliche frage: wie kann ich machen, dass das verhalten definiert ist, wenn man eine instanz ausgibt ohne einen manipulator gesetzt zu haben? muss ich da für die map den allocator verändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352919</guid><dc:creator><![CDATA[doktor banane]]></dc:creator><pubDate>Mon, 16 Sep 2013 11:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 11:12:10 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Und es ist auch richtig, dass der Parameter per value übergeben wird? In dem Fall in Zeile 17 das <em>manipulator_mit_parameter</em> Objekt?</p>
</blockquote>
<p>Was soll daran falsch sein? Es ist im Gegenteil gut, da <code>manipulator_mit_parameter</code> nur <code>sizeof(int)</code> groß sein wird... man übergibt nur per Referenz bei Klassen mit teurem Kopierkonstruktor.</p>
</blockquote>
<p>Nein, darum gings mir nicht. Schon klar, dass genügend kleine Daten per Value zu übergeben sind.</p>
<p>Ich frage nur deshalb, weil Werner vor einiger Zeit etwas mit IOStreams gepostet hat, wo ein Call-By-Value durchgeführt wurde, den ich für falsch hielt. Aber per const&amp; kompilierte es nichtmal.</p>
<p>Daher die Frage, ist die Übergabekonvention egal oder macht die wirklich was aus?</p>
<p>Andererseits trifft SeppJ's Antwort nicht die Frage des TEs...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352920</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 16 Sep 2013 11:12:10 GMT</pubDate></item><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 11:34:20 GMT]]></title><description><![CDATA[<blockquote>
<p>ich würde ja gerne mit dem manipulator selbst noch nichts ausgeben, sondern lediglich bestimmen, wie das nächste, das ausgegeben wird, aussehen soll.</p>
</blockquote>
<p>Dafür musst du den Stream per <code>iword</code> / <code>pword</code> erweitern. Ich poste gleich mal ein Beispiel. (Wo ist Werner, wenn man in braucht?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352921</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 16 Sep 2013 11:34:20 GMT</pubDate></item><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 12:13:32 GMT]]></title><description><![CDATA[<p>Hier ein (schlecht konstruiertes) Beispiel:</p>
<pre><code>#include &lt;ios&gt;

struct A {};

int getFormatIPIndex()
{
	static int const i = std::ios_base::xalloc();
	return i;
}

enum flag_t { Hello, World };

struct setflag
{
	flag_t flag;

	setflag( flag_t f ) :
		flag{f} {}
};

#include &lt;ostream&gt;

std::ostream&amp; operator&lt;&lt;( std::ostream&amp; os, setflag a )
{
    os.iword(getFormatIPIndex()) = a.flag;
    return os;
}

std::ostream&amp; operator&lt;&lt;( std::ostream&amp; os, A )
{
	auto index = os.iword(getFormatIPIndex());

	if( index == Hello )
		os &lt;&lt; &quot;Hello &quot;;
	else if( index == World )
		os &lt;&lt; &quot;World&quot;;

	return os;
}

#include &lt;iostream&gt;

int main()
{
	std::cout &lt;&lt; setflag(Hello) &lt;&lt; A{} &lt;&lt; setflag(World) &lt;&lt; A{};
}
</code></pre>
<p>Ideone: <a href="http://ideone.com/c5rIzM" rel="nofollow">http://ideone.com/c5rIzM</a></p>
<blockquote>
<p>Daher die Frage, ist die Übergabekonvention egal oder macht die wirklich was aus?</p>
</blockquote>
<p>Was ausmachen im Bezug auf was? Ja, in einem Fall wird kopiert/gemoved und im anderen nicht. Auch für die Überladung macht es einen Unterschied. Aber beides ist erlaubt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352928</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 16 Sep 2013 12:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to eigene flags zu eigenen datentypen? on Mon, 16 Sep 2013 12:25:48 GMT]]></title><description><![CDATA[<p>ahh okay, danke. genau so etwas habe ich gemeint. ich kannte das nicht mit dem xalloc, bin relativ neu bei c++.</p>
<p>gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352932</guid><dc:creator><![CDATA[doktor banane]]></dc:creator><pubDate>Mon, 16 Sep 2013 12:25:48 GMT</pubDate></item></channel></rss>