<?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== für struct automatisch definieren?]]></title><description><![CDATA[<p>Wie kann ich in C++11 einen operator== für einen</p>
<pre><code>struct S
{
	unsigned d: 4;
	unsigned c: 4;
	unsigned b: 1;
	unsigned a: 1;
};
</code></pre>
<p>automatisch definieren lassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323554/operator-für-struct-automatisch-definieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 22:21:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323554.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Feb 2014 12:52:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 12:52:06 GMT]]></title><description><![CDATA[<p>Wie kann ich in C++11 einen operator== für einen</p>
<pre><code>struct S
{
	unsigned d: 4;
	unsigned c: 4;
	unsigned b: 1;
	unsigned a: 1;
};
</code></pre>
<p>automatisch definieren lassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381454</guid><dc:creator><![CDATA[fdgfd]]></dc:creator><pubDate>Tue, 04 Feb 2014 12:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 13:02:28 GMT]]></title><description><![CDATA[<p>lol, lass das mit den Bitsets und berechne die Zugriffe selber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381459</guid><dc:creator><![CDATA[don&#x27;t use bitsets!]]></dc:creator><pubDate>Tue, 04 Feb 2014 13:02:28 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 13:05:00 GMT]]></title><description><![CDATA[<p>So direkt gar nicht. Du könntest höchstens ein tupel nehmen, das bringt den Vergleichsoperator bereits mit. Ansonsten könntest du die mal boost/operators anschauen, das könnte vielleicht das sein, was du suchst.</p>
<p>Edit: Ups, hatte nicht gesehen, das das ein Bitset ist, da gelten wahrscheinlich andere Regeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381462</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Tue, 04 Feb 2014 13:05:00 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 13:15:26 GMT]]></title><description><![CDATA[<blockquote>
<p>automatisch definieren lassen?</p>
</blockquote>
<p>Gar nicht. Obwohl... moeglicherweise koennte man ein Template schreiben, welches die Adressen der Member als Template-Parameter nimmt und ... ja, das koennte funktionieren, ich bin nur gerade in der Schule, daher... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Edit: Ich probiere es mal bei Ideone.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381465</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 04 Feb 2014 13:15:26 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 13:33:25 GMT]]></title><description><![CDATA[<p>Heureka!</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;algorithm&gt;
using namespace std;

template&lt; typename Base, typename... T &gt;
struct Comparer
{
	template&lt; T Base::* ... ptr &gt;
	struct Members 
	{
		static bool compare( Base const&amp; lhs, Base const&amp; rhs )
		{
			bool arr[]{ ( lhs.*ptr == rhs.*ptr )... };
			return all_of( begin(arr), end(arr), [](bool b){return b;} );
		}

	};
};

struct A
{
	int a;
	char b;
};

int main() 
{
	A a{4, '7'}, b=a, c{5, '7'};
	cout &lt;&lt; Comparer&lt;A, int, char&gt;::Members&lt;&amp;A::a, &amp;A::b&gt;::compare(a, b);
	cout &lt;&lt; Comparer&lt;A, int, char&gt;::Members&lt;&amp;A::a, &amp;A::b&gt;::compare(a, c);
}
</code></pre>
<p>Scheint zu funktionieren <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="🙂"
    /><br />
Muss man nur noch so umschreiben, dass man nicht die Typen der Member redundanterweise angibt. Das sollte auch recht einfach gehen.<br />
Edit: Den Typ der Klasse muss man eigentlich auch nicht angeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381468</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 04 Feb 2014 13:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 13:45:26 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>moeglicherweise koennte man ein Template schreiben, welches die Adressen der Member als Template-Parameter nimmt</p>
</blockquote>
<p>Mit Bitfeldern wird das allerdings nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381469</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 04 Feb 2014 13:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 13:59:46 GMT]]></title><description><![CDATA[<p>Habe es fertig:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;algorithm&gt;
using namespace std;

template&lt; typename Base, typename... T &gt;
struct Comparer
{
	template&lt; T Base::* ... ptr &gt;
	struct Members 
	{
		static bool compare( Base const&amp; lhs, Base const&amp; rhs )
		{
			bool arr[]{ ( lhs.*ptr == rhs.*ptr )... };
			return all_of( begin(arr), end(arr), [](bool b){return b;} );
		}
	};
};

template&lt; typename T &gt; struct get_type;
template&lt; typename Type, typename Class &gt; 
struct get_type&lt;Type Class::*&gt;
{
	using type = Type;
	using class_type = Class;
};

template&lt;typename...&gt; struct type_list;

template&lt;typename ... Args&gt;
type_list&lt;Args...&gt; get_types( Args... );

template&lt;typename&gt; struct create_comparer;
template&lt; typename First, typename ... Tail &gt;
struct create_comparer&lt;type_list&lt;First, Tail...&gt;&gt; :  
	Comparer&lt;typename get_type&lt;First&gt;::class_type, 
             typename get_type&lt;First&gt;::type,
             typename get_type&lt;Tail&gt;::type...&gt; {};

#define CREATE_COMPARER(...) create_comparer&lt;decltype(get_types(__VA_ARGS__))&gt;::Members&lt;__VA_ARGS__&gt;

struct A
{
	int a;
	char b;
};

int main() 
{
	A a{4, '7'}, b=a, c{5, '7'};
	cout &lt;&lt; CREATE_COMPARER(&amp;A::a, &amp;A::b)::compare(a, b);
	cout &lt;&lt; CREATE_COMPARER(&amp;A::a, &amp;A::b)::compare(a, c);
}
</code></pre>
<p><a href="http://ideone.com/F1QGCJ" rel="nofollow">http://ideone.com/F1QGCJ</a><br />
Geht vielleicht einfacher, sehe ich mir nochmal an wenn ich wieder zuhause bin.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Ich fordere dich heraus.</p>
</blockquote>
<p>??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381473</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 04 Feb 2014 13:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 14:16:45 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Ich fordere dich heraus.</p>
</blockquote>
<p>??</p>
</blockquote>
<p>Wo hast du das Zitat her?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381474</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 04 Feb 2014 14:16:45 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 17:51:35 GMT]]></title><description><![CDATA[<p>Lässt sich noch vereinfachen und vervollständigen:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;algorithm&gt;

template&lt; typename Base, typename... MemTypes &gt;
struct Comparer
{
	using class_type = Base;

	template&lt; MemTypes Base::* ... mem_ptr &gt;
	struct Members
	{
		static bool compare( Base const&amp; lhs, Base const&amp; rhs )
		{
			bool arr[]{ ( lhs.*mem_ptr == rhs.*mem_ptr )... };

			return std::find( arr, std::end(arr), false) == std::end(arr);
		}
	};
};

template&lt; typename Base, typename ... Tail &gt;
Comparer&lt;Base, Tail...&gt; create_comparer( Tail Base::*... );

#define COMPARER(...) decltype(create_comparer(__VA_ARGS__))
#define DEFINE_COMPARE( ... ) \
	bool operator==( COMPARER(__VA_ARGS__)::class_type const&amp; lhs, \
	                 COMPARER(__VA_ARGS__)::class_type const&amp; rhs ) \
	{ \
		return COMPARER(__VA_ARGS__)::Members&lt;__VA_ARGS__&gt;::compare(lhs, rhs); \
	}

struct A
{
	int a;
	char b;
};

DEFINE_COMPARE( &amp;A::a, &amp;A::b )

int main()
{
	A a{4, '7'}, b=a, c{5, '7'};
	std::cout &lt;&lt; (a == b) &lt;&lt; ' ' &lt;&lt; (a == c);
}
</code></pre>
<p>Der Vorteil hierbei ist, dass das ganze recht flexibel gestaltet werden kann - die Member die verglichen werden sollen, sowie die Reihenfolge sind frei festlegbar. Für diesen konkreten Fall (dank Bitsets) aber nutzlos.<br />
Hätte nicht gedacht, dass das in 30 Zeilen passt.<br />
~<br />
Edit²: Noch weiter vereinfacht.<br />
EDit³: Noch weiter ... .~</p>
<p>camper schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Ich fordere dich heraus.</p>
</blockquote>
<p>??</p>
</blockquote>
<p>Traust du dich etwa nicht?</p>
</blockquote>
<p>Doch, schon, aber was soll das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381508</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 04 Feb 2014 17:51:35 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 17:53:28 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Ich fordere dich heraus.</p>
</blockquote>
<p>??</p>
</blockquote>
<p>Traust du dich etwa nicht?</p>
</blockquote>
<p>Doch, schon, aber was soll das?</p>
</blockquote>
<p>Spinnt unser lieber Hacker nun völlig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381510</guid><dc:creator><![CDATA[Mister Einschaltquote]]></dc:creator><pubDate>Tue, 04 Feb 2014 17:53:28 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 17:59:41 GMT]]></title><description><![CDATA[<p>Wie mir gerade (etwas spät) auffällt, ist dabei ja gar keine bedingte Auswertung möglich... das müsste auch gehen, mir fällt nur spontan kein Weg ein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381513</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 04 Feb 2014 17:59:41 GMT</pubDate></item><item><title><![CDATA[Reply to operator== für struct automatisch definieren? on Tue, 04 Feb 2014 18:09:06 GMT]]></title><description><![CDATA[<p>Doch, geht - durch folgende Neudefinition von <code>Compare</code> :</p>
<pre><code>template&lt; typename Base, typename MemType, typename... MemTypes &gt;
struct Comparer
{
	using class_type = Base;

	template&lt; MemType Base::* first, MemTypes Base::* ... mem_ptr &gt;
	struct Members
	{
		static bool compare( Base const&amp; lhs, Base const&amp; rhs )
		{
			return lhs.*first == rhs.*first &amp;&amp; Comparer&lt;Base, MemTypes...&gt;::template Members&lt;mem_ptr...&gt;::compare(lhs, rhs);
		}
	};
};

template&lt; typename Base, typename MemType&gt;
struct Comparer&lt;Base, MemType&gt;
{
	using class_type = Base;

	template&lt; MemType Base::* first &gt;
	struct Members
	{
		static bool compare( Base const&amp; lhs, Base const&amp; rhs )
		{
			return lhs.*first == rhs.*first;
		}
	};
};
</code></pre>
<p>Edit: Ich sollte wohl wissen, das es <code>Comparator</code> heißen sollte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381516</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 04 Feb 2014 18:09:06 GMT</pubDate></item></channel></rss>