<?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[vergleichoperator zur compilierzeit aufrufen]]></title><description><![CDATA[<p>hi,<br />
ich versuche zur compilierzeit herauszufinden ob ein typ einen vergleichoperator definiert hat.</p>
<p>Ich habe es schon hingekriegt, dass es zur laufzeit funktioniert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct A{ };

struct AA
{
	bool operator==(const AA&amp; )const { return true; }
};

struct AAA
{
	friend bool operator==(const AAA&amp;, const AAA&amp;){ return true; }
};

namespace __hidden_
{

struct CNoType7Byte{ char dummy[7]; };

template &lt;typename T&gt;
CNoType7Byte operator==(const T&amp;, const T&amp;) { return CNoType7Byte(); }

} // namespace __hidden_

template &lt;typename T&gt;
struct CIsComparable
{
	static bool Result()
	{
		using namespace __hidden_;

                // hier ist das problem, denn hier werden
                // Objektinstanzen erstellt.
		T t; 
                // Geht es irgendwie die typen an sich zu vergleichen.
		return sizeof(t == t) != sizeof(CNoType7Byte);
	}
};

template &lt;typename T&gt;
inline bool IsComparable(){ return CIsComparable&lt;T&gt;::Result(); }

int main()
{
	std::cout &lt;&lt; IsComparable&lt;int&gt;() &lt;&lt; std::endl; // gibt 1
	std::cout &lt;&lt; IsComparable&lt;A&gt;() &lt;&lt; std::endl; // gibt 0
	std::cout &lt;&lt; IsComparable&lt;AA&gt;() &lt;&lt; std::endl; // gibt 1
	std::cout &lt;&lt; IsComparable&lt;AAA&gt;() &lt;&lt; std::endl; // gibt 1
}
</code></pre>
<p>Oder weiß jemand dafür eine bessere Möglichkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185023/vergleichoperator-zur-compilierzeit-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 01:18:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185023.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Jun 2007 10:23:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vergleichoperator zur compilierzeit aufrufen on Thu, 21 Jun 2007 10:23:11 GMT]]></title><description><![CDATA[<p>hi,<br />
ich versuche zur compilierzeit herauszufinden ob ein typ einen vergleichoperator definiert hat.</p>
<p>Ich habe es schon hingekriegt, dass es zur laufzeit funktioniert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct A{ };

struct AA
{
	bool operator==(const AA&amp; )const { return true; }
};

struct AAA
{
	friend bool operator==(const AAA&amp;, const AAA&amp;){ return true; }
};

namespace __hidden_
{

struct CNoType7Byte{ char dummy[7]; };

template &lt;typename T&gt;
CNoType7Byte operator==(const T&amp;, const T&amp;) { return CNoType7Byte(); }

} // namespace __hidden_

template &lt;typename T&gt;
struct CIsComparable
{
	static bool Result()
	{
		using namespace __hidden_;

                // hier ist das problem, denn hier werden
                // Objektinstanzen erstellt.
		T t; 
                // Geht es irgendwie die typen an sich zu vergleichen.
		return sizeof(t == t) != sizeof(CNoType7Byte);
	}
};

template &lt;typename T&gt;
inline bool IsComparable(){ return CIsComparable&lt;T&gt;::Result(); }

int main()
{
	std::cout &lt;&lt; IsComparable&lt;int&gt;() &lt;&lt; std::endl; // gibt 1
	std::cout &lt;&lt; IsComparable&lt;A&gt;() &lt;&lt; std::endl; // gibt 0
	std::cout &lt;&lt; IsComparable&lt;AA&gt;() &lt;&lt; std::endl; // gibt 1
	std::cout &lt;&lt; IsComparable&lt;AAA&gt;() &lt;&lt; std::endl; // gibt 1
}
</code></pre>
<p>Oder weiß jemand dafür eine bessere Möglichkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310528</guid><dc:creator><![CDATA[frager]]></dc:creator><pubDate>Thu, 21 Jun 2007 10:23:11 GMT</pubDate></item><item><title><![CDATA[Reply to vergleichoperator zur compilierzeit aufrufen on Thu, 21 Jun 2007 12:26:38 GMT]]></title><description><![CDATA[<p>Da du sowieso mit Templates arbeitest, kannst du ja einfach &quot;behaupten&quot;, daß der verwendete Typ vergleichbar ist - wenn du etwas unvergleichbares als Parameter mitgibst, wird dir der Compiler schon einen &quot;no matching function&quot; entgegenwerfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310639</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 21 Jun 2007 12:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to vergleichoperator zur compilierzeit aufrufen on Thu, 21 Jun 2007 12:43:42 GMT]]></title><description><![CDATA[<p>das problem ist, dass ich dann eine alternative funktion aufrufen möchte, wenn die typen nicht vergleichbar sind. Eine fehlermeldung bringt mir da recht wenig.</p>
<p>Natürlich funktioniert mit Code von mir oben, auch wenn ich erst zur laufzeit herausfinde, ob der typ vergleichbar ist oder nicht. aber zur compilierzeit wäre es doch viel schöner, finde ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310660</guid><dc:creator><![CDATA[frager]]></dc:creator><pubDate>Thu, 21 Jun 2007 12:43:42 GMT</pubDate></item><item><title><![CDATA[Reply to vergleichoperator zur compilierzeit aufrufen on Thu, 21 Jun 2007 12:47:58 GMT]]></title><description><![CDATA[<p>frager schrieb:</p>
<blockquote>
<p>das problem ist, dass ich dann eine alternative funktion aufrufen möchte, wenn die typen nicht vergleichbar sind. Eine fehlermeldung bringt mir da recht wenig.</p>
<p>Natürlich funktioniert mit Code von mir oben, auch wenn ich erst zur laufzeit herausfinde, ob der typ vergleichbar ist oder nicht. aber zur compilierzeit wäre es doch viel schöner, finde ich.</p>
</blockquote>
<p>Neee - auch in Deinem Code steckt die Information, bereits zur Compilezeit ... Du wertest sie aber erst zur Laufzeit aus - was ich persönlich &quot;quatschig&quot; finde. <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>Mein Vorschlag: Mach bereits die &quot;Auswahl der richtigen Funktion&quot; zur Compilezeit (z.B. via overloading oder templates).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310663</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 21 Jun 2007 12:47:58 GMT</pubDate></item><item><title><![CDATA[Reply to vergleichoperator zur compilierzeit aufrufen on Thu, 21 Jun 2007 12:49:50 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Mein Vorschlag: Mach bereits die &quot;Auswahl der richtigen Funktion&quot; zur Compilezeit (z.B. via overloading oder templates).</p>
</blockquote>
<p>So, und kannst du die Realisierung als Quelltext dazu posten? Ich sitze an dem Problem nämlich schon den einen oder anderen Tag. Mir fällt da einfach nix zu ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310665</guid><dc:creator><![CDATA[frager]]></dc:creator><pubDate>Thu, 21 Jun 2007 12:49:50 GMT</pubDate></item><item><title><![CDATA[Reply to vergleichoperator zur compilierzeit aufrufen on Thu, 21 Jun 2007 12:53:13 GMT]]></title><description><![CDATA[<p>Die Grundkonstruktion arbeitet auch zur Compilezeit, du mußt jetzt nur einen Weg finden, sie auch zur Compilezeit auszuwerten:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct CIsComparable
{
    static bool Result()
    {
        using namespace __hidden_;

                // hier ist das problem, denn hier werden
                // Objektinstanzen erstellt.
        T t; 
                // Geht es irgendwie die typen an sich zu vergleichen.
        return sizeof(t == t) != sizeof(CNoType7Byte);
    }

    enum{value=(sizeof(T()==T()) != sizeof(CNoType7Byte))};
};

template&lt;typename T,bool comp&gt;
struct compare
{
  bool operator()(const T&amp; l,const T&amp; r)
  { return l==r; }
};

template&lt;typename T&gt;
struct compare&lt;T,false&gt;
{
  bool operator()(const T&amp; l,const T&amp;r)
  { return my_special_compare(l,r); }
};

template&lt;typename T&gt;
void do_something(...)
{
  compare&lt;T,CIsComparable&lt;T&gt;::value&gt; cmp;
  //alle Elementvergleiche verwenden cmp(x,y) anstelle von x==y
}
</code></pre>
<p>PS: Schonmaldie Boost-Bibliothek durchforstet? Afair gibt es dort auch ein Paket, mit dem du wichtige Typ-Eigenschaften (Default-bonstruierbar, vergleichbar,...) checken kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310670</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 21 Jun 2007 12:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to vergleichoperator zur compilierzeit aufrufen on Thu, 21 Jun 2007 13:00:46 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>oder einfach, wie CStoll es zuerst vorgeschlagern hat: <code>operator==(TypA const&amp;, TypB const&amp;)</code> einfach benutzen ... der Compiler sagt Dir schon (und zwar nicht ungenauer oder unzuverlässiger als alle template-Versuche), wenn es keinen gibt.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310675</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 21 Jun 2007 13:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to vergleichoperator zur compilierzeit aufrufen on Thu, 21 Jun 2007 13:09:35 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<pre><code class="language-cpp">enum{value=(sizeof(T()==T()) != sizeof(CNoType7Byte))};
</code></pre>
</blockquote>
<p>Danke, das war was ich gesucht habe. War irgendwie viel zu sehr darauf verbort, dass == auch immer true zurückgeben muss. <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>Bei boost habe ich geschaut, hab nix gefunden. Kann sein, dass ich da was übersehen habe, benutze boost eigentlich selbst nie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1310689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1310689</guid><dc:creator><![CDATA[frager]]></dc:creator><pubDate>Thu, 21 Jun 2007 13:09:35 GMT</pubDate></item></channel></rss>