<?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[SFINAE und enable_if]]></title><description><![CDATA[<p>Hi,</p>
<p>ich versuche grade per Metaprogrammierung bestimmte Methoden einer Klasse in Abhängigkeit ihrer Template-Typen umzusetzen.</p>
<pre><code>#include &lt;type_traits&gt;

template&lt;std::size_t R, std::size_t N&gt;
struct IsRankN
{
   static const bool value = (R == N);
};

template&lt;typename T,std::size_t R&gt;
class Test
{
   using IsRank1 = std::enable_if&lt;IsRankN&gt;R,1&gt;&gt;; // Test auf R = 1
   using IsRank2 = std::enable_if&lt;IsRankN&gt;R,2&gt;&gt;; // Test auf R = 2

   // soll nur existieren für R = 1
   typename IsRank1::type f( std::size_t d0 );

   // soll nur existieren für R = 2
   typename IsRank2::type f( std::size_t d0, std::size_t d1 );
};

int main()
{
   Test&lt;int,1&gt; t1;
   t1.f( 1 );

   Test&lt;int,2&gt; t2;
   t2.f( 1,2 );
}
</code></pre>
<p>Ich probiere da schon eine Weile rum, krieg´s aber iwie nicht hin. Kann mir da jemand vielleicht ein funktionierendes Beispiel geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/336777/sfinae-und-enable_if</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 02:03:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/336777.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Feb 2016 10:41:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SFINAE und enable_if on Tue, 16 Feb 2016 10:43:55 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich versuche grade per Metaprogrammierung bestimmte Methoden einer Klasse in Abhängigkeit ihrer Template-Typen umzusetzen.</p>
<pre><code>#include &lt;type_traits&gt;

template&lt;std::size_t R, std::size_t N&gt;
struct IsRankN
{
   static const bool value = (R == N);
};

template&lt;typename T,std::size_t R&gt;
class Test
{
   using IsRank1 = std::enable_if&lt;IsRankN&gt;R,1&gt;&gt;; // Test auf R = 1
   using IsRank2 = std::enable_if&lt;IsRankN&gt;R,2&gt;&gt;; // Test auf R = 2

   // soll nur existieren für R = 1
   typename IsRank1::type f( std::size_t d0 );

   // soll nur existieren für R = 2
   typename IsRank2::type f( std::size_t d0, std::size_t d1 );
};

int main()
{
   Test&lt;int,1&gt; t1;
   t1.f( 1 );

   Test&lt;int,2&gt; t2;
   t2.f( 1,2 );
}
</code></pre>
<p>Ich probiere da schon eine Weile rum, krieg´s aber iwie nicht hin. Kann mir da jemand vielleicht ein funktionierendes Beispiel geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487353</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 16 Feb 2016 10:43:55 GMT</pubDate></item><item><title><![CDATA[Reply to SFINAE und enable_if on Tue, 16 Feb 2016 11:22:57 GMT]]></title><description><![CDATA[<p>Das ist eigentlich nicht so der ganz typische Ansatz für SFINAE weil es bei dir vom Template Parameter der Klasse und nicht der Funktion abhängen soll. Dazu muss man eine zusätzliche Indirektion über Default Template Parameter einbauen:</p>
<pre><code>template&lt;typename T,std::size_t R&gt;
class Test
{
public:
   // soll nur existieren für R = 1
   template&lt;std::size_t X = R&gt;
   typename std::enable_if&lt;X == 1&gt;::type f( std::size_t d0 )
   {
   }

   // soll nur existieren für R = 2
   template&lt;std::size_t X = R&gt;
   typename std::enable_if&lt;X == 2&gt;::type f( std::size_t d0, std::size_t d1 )
   {
   }
};
</code></pre>
<p>Abkürzen der Typen über <code>using</code> funktioniert ziemlich sicher nicht. Und dein <code>IsRankN</code> Struct ist eigentlich unnötig. So eine Hilfsklasse braucht man nur wenn man Typen vergleichen will.</p>
<p>Man könnte etwas ähnliches übrigens auch über Spezialisierung der Klasse erreichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487358</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Tue, 16 Feb 2016 11:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to SFINAE und enable_if on Tue, 16 Feb 2016 11:25:59 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich probiere da schon eine Weile rum, krieg´s aber iwie nicht hin.</p>
</blockquote>
<p>Natürlich nicht, die Instantiierung der Klasse impliziert die Instantiierung aller enthaltenen Deklarationen.</p>
<p>Du möchtest evt. partiell Spezialisieren.</p>
<pre><code>template &lt;typename, std::size_t&gt; 
class Test; 
template &lt;typename T&gt;
class Test&lt;T, 1&gt; {
   void f( std::size_t d0 ); 
};
template &lt;typename T&gt;
class Test&lt;T, 2&gt; {
   void f( std::size_t d0, std::size_t d1 ); 
};

int main() 
{ 
   Test&lt;int,1&gt; t1; 
   t1.f( 1 ); 

   Test&lt;int,2&gt; t2; 
   t2.f( 1,2 ); 
}
</code></pre>
<p><a href="http://coliru.stacked-crooked.com/a/c6211862a6fafce9" rel="nofollow">Demo</a>. Wenn noch gemeinsame Member/Basisklassen existieren, einfach in eine gemeinsame Basisklasse auslagern. (Zu dieser Unschönheit gibt es IIRC ein Proposal, dass die Definition des Primärtemplates übernimmt; Wäre klasse, wenn sich EWG das mal anschaut.)</p>
<p>Sebis Vorschlag ist die zweite (mMn. unschöne) Option.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487359</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 16 Feb 2016 11:25:59 GMT</pubDate></item><item><title><![CDATA[Reply to SFINAE und enable_if on Wed, 17 Feb 2016 09:31:44 GMT]]></title><description><![CDATA[<p>Danke für die Hinweise. Grund für die Frage ist eine alte Array Klasse, die für bis zu 4 Dimensionen verschiedene Funktionen anbietet. Somit gibt es zB für 1D Arrays eine <code>resize( int,int )</code> Methode, die natürlich Quatsch ist. Um ein Refactoring zu vermeiden wollte ich per <code>enable_if</code> verschiedene Methoden von der Anzahl der Dimensionen abhängig machen.<br />
Bin jetzt aber Arcoths Vorschlag gefolgt und hab´s per Vererbung umgesetzt. Ist mit Sicherheit die bessere Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487542</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 17 Feb 2016 09:31:44 GMT</pubDate></item></channel></rss>