<?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[Merkwürdiges Konstrukt endeckt :)]]></title><description><![CDATA[<p>Hi an alle. Ich hab neulich mal wieder ein bißchen source code gelesen und bin dabei auf das hier gestossen:</p>
<pre><code class="language-cpp">template &lt;typename Y&gt; no class_p_test (...);
      template &lt;typename Y&gt; yes class_p_test (void (Y::*) ());

      template &lt;typename X&gt;
      struct class_p
      {
        static bool const r = sizeof (class_p_test&lt;X&gt; (0)) == sizeof (yes);
      };
</code></pre>
<p>Kann mir das mal jemand erklären bitte. Steh völlig aufm Schlauch...<br />
Vorallem das hier:</p>
<pre><code class="language-cpp">template &lt;typename Y&gt; no class_p_test (...);
      template &lt;typename Y&gt; yes class_p_test (void (Y::*) ());
</code></pre>
<p>Danke schonmal <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/topic/284092/merkwürdiges-konstrukt-endeckt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 08:32:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284092.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Mar 2011 13:43:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Merkwürdiges Konstrukt endeckt :) on Fri, 25 Mar 2011 13:43:56 GMT]]></title><description><![CDATA[<p>Hi an alle. Ich hab neulich mal wieder ein bißchen source code gelesen und bin dabei auf das hier gestossen:</p>
<pre><code class="language-cpp">template &lt;typename Y&gt; no class_p_test (...);
      template &lt;typename Y&gt; yes class_p_test (void (Y::*) ());

      template &lt;typename X&gt;
      struct class_p
      {
        static bool const r = sizeof (class_p_test&lt;X&gt; (0)) == sizeof (yes);
      };
</code></pre>
<p>Kann mir das mal jemand erklären bitte. Steh völlig aufm Schlauch...<br />
Vorallem das hier:</p>
<pre><code class="language-cpp">template &lt;typename Y&gt; no class_p_test (...);
      template &lt;typename Y&gt; yes class_p_test (void (Y::*) ());
</code></pre>
<p>Danke schonmal <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/2039933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039933</guid><dc:creator><![CDATA[addicted_to_c]]></dc:creator><pubDate>Fri, 25 Mar 2011 13:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Konstrukt endeckt :) on Fri, 25 Mar 2011 13:53:26 GMT]]></title><description><![CDATA[<p>Das Ding sagt, ob der Typ ein Zeiger auf eine void() Memberfunktion ist. Wenn das X ein void(T::*)() ist, wird sizeof auf die Funktion aufgerufen, die 'yes' zurück gibt. Ansonsten auf 'no'. Deshalb die Ellipsen-Funktion.</p>
<p>Lässt sich dann so verwenden:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; class_p&lt;void(*)()&gt;::r &lt;&lt; std::endl;
std::cout &lt;&lt; class_p&lt;void(T::*)()&gt;::r &lt;&lt; std::endl;
</code></pre>
<p>Im Prinzip eine einfache Form von Metaprogrammierung <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2039942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039942</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 25 Mar 2011 13:53:26 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Konstrukt endeckt :) on Sat, 26 Mar 2011 11:36:05 GMT]]></title><description><![CDATA[<p>addicted_to_c schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename Y&gt; no class_p_test (...);
      template &lt;typename Y&gt; yes class_p_test (void (Y::*) ());

      template &lt;typename X&gt;
      struct class_p
      {
        static bool const r = sizeof (class_p_test&lt;X&gt; (0)) == sizeof (yes);
      };
</code></pre>
<p>Kann mir das mal jemand erklären bitte. Steh völlig aufm Schlauch...</p>
</blockquote>
<p>In C++ gibt es im Zusammenhang mit Templates &quot;SFINAE&quot; (substitution failure is not an error). Wenn der Compiler für einen Typparameter (hier Y) einen speziellen Typ einsetzt und es dabei im direkten Umfeld eine &quot;substitution failure&quot; gibt, dann wird dies nicht als Fehler gewertet, sondern das Template einfach ignoriert. Wenn dabei natürlich keine aufrufbare Funktion übrig bleibt, gibt es einen Fehler. Funktionen können aber überladen werden.</p>
<p>Für einige Belegungen des Typparameters Y wird Y::* einen Sinn ergeben (für Klassentypen) und für andere nicht (zB für int). In Abhängigkeit von Y wird also entweder nur das erste Funktionstemplate oder alle beide in der Überladungsmenge sein. Und da die Ellipse bei der Überladungsauflösung als schlechtester Match eingestuft wird, wird also in Abhängigkeit von Y entweder die erste oder die zweite Funktion aufgerufen. Und welche Funktion aufgerufen werden würde, erfährt man über den Rückgabetyp.</p>
<p>class_p ist also eine Metafunktion, die sagt, ob der übergebene Typparameter X ein Klassentyp ist oder nicht. Für Klassentypen kommt nämlich das zweite class_p_test in Frage, welches ein yes zurückgibt. Für nicht-Klassentypen kommt das erste class_p_test in Frage, welches ein no zurückgibt.</p>
<pre><code class="language-cpp">...

struct classtype {};
typedef int scalartype;

int main()
{
  assert(  class_p&lt;classtype &gt;::r );
  assert( !class_p&lt;scalartype&gt;::r );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2039988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039988</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 26 Mar 2011 11:36:05 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Konstrukt endeckt :) on Fri, 25 Mar 2011 15:25:36 GMT]]></title><description><![CDATA[<p>Hachja, da hab ich wohl ungenau gelesen, krümelkackers Erklärung stimmt natürlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039995</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 25 Mar 2011 15:25:36 GMT</pubDate></item></channel></rss>