<?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, hier in Ordnung?]]></title><description><![CDATA[<p>Ich hab ein paar Klassen, die zueinander statisch polymorph sind und möchte nun Operatoren zwischen allen abgeleiteten Klassen definieren. Mein Ansatz sieht etwa so aus:</p>
<pre><code>struct a{};
//Die Basisklasse aller Klassen in dieser Hierarchie; vom Template-Typen unabhängig; macht nichts besonderes, sondern dient lediglich der Identifikation

template&lt;typename T&gt;
struct b : a{};
//Hier sind je nach Typ T Dinge drin, die für die abgeleiteten Klassen interessant sind

template&lt;typename T&gt;
struct c : b&lt;T&gt;{};
template&lt;typename T&gt;
struct d : b&lt;T&gt;{};
//Gibt noch 'ne Menge mehr, hier einfach mal exemplarisch zwei Stück

template&lt;typename L, typename R&gt;
struct add_helper {
	L l;
	R r;
	add_helper(const L &amp;l, const R &amp;r) : l(l), r(r) {}
	//Schlussendlich stecken hier dann einige interessante Dinge drin, die mit l und r operieren
};

template&lt;typename L, typename R, typename = typename std::enable_if&lt;std::is_base_of&lt;a, L&gt;::value &amp;&amp; std::is_base_of&lt;a, R&gt;::value&gt;::type&gt;
add_helper&lt;L, R&gt; operator+ (const L &amp;l, const R &amp;r)
{
	return add_helper&lt;L, R&gt;(l, r);
}

int main()
{
	some_l33t_func(c&lt;int&gt;(...) + d&lt;float&gt;(...));
}
</code></pre>
<p>Kann das Konflikte geben mit anderen überladenen Operatoren? Wie würdet ihr sowas machen? Das Ziel ist es nur, dass ich einen <code>operator$</code> habe für beliebige von <code>a</code> abgeleitete Typen, der nur so eine Helper-Klasse zurückgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326483/sfinae-hier-in-ordnung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 26 May 2026 14:29:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326483.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Jun 2014 14:31:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SFINAE, hier in Ordnung? on Fri, 20 Jun 2014 14:31:38 GMT]]></title><description><![CDATA[<p>Ich hab ein paar Klassen, die zueinander statisch polymorph sind und möchte nun Operatoren zwischen allen abgeleiteten Klassen definieren. Mein Ansatz sieht etwa so aus:</p>
<pre><code>struct a{};
//Die Basisklasse aller Klassen in dieser Hierarchie; vom Template-Typen unabhängig; macht nichts besonderes, sondern dient lediglich der Identifikation

template&lt;typename T&gt;
struct b : a{};
//Hier sind je nach Typ T Dinge drin, die für die abgeleiteten Klassen interessant sind

template&lt;typename T&gt;
struct c : b&lt;T&gt;{};
template&lt;typename T&gt;
struct d : b&lt;T&gt;{};
//Gibt noch 'ne Menge mehr, hier einfach mal exemplarisch zwei Stück

template&lt;typename L, typename R&gt;
struct add_helper {
	L l;
	R r;
	add_helper(const L &amp;l, const R &amp;r) : l(l), r(r) {}
	//Schlussendlich stecken hier dann einige interessante Dinge drin, die mit l und r operieren
};

template&lt;typename L, typename R, typename = typename std::enable_if&lt;std::is_base_of&lt;a, L&gt;::value &amp;&amp; std::is_base_of&lt;a, R&gt;::value&gt;::type&gt;
add_helper&lt;L, R&gt; operator+ (const L &amp;l, const R &amp;r)
{
	return add_helper&lt;L, R&gt;(l, r);
}

int main()
{
	some_l33t_func(c&lt;int&gt;(...) + d&lt;float&gt;(...));
}
</code></pre>
<p>Kann das Konflikte geben mit anderen überladenen Operatoren? Wie würdet ihr sowas machen? Das Ziel ist es nur, dass ich einen <code>operator$</code> habe für beliebige von <code>a</code> abgeleitete Typen, der nur so eine Helper-Klasse zurückgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404756</guid><dc:creator><![CDATA[Apfelkuchen um 4]]></dc:creator><pubDate>Fri, 20 Jun 2014 14:31:38 GMT</pubDate></item><item><title><![CDATA[Reply to SFINAE, hier in Ordnung? on Fri, 20 Jun 2014 15:19:17 GMT]]></title><description><![CDATA[<p>Das sieht isoliert aus.<br />
Für das enable_if-Argument empfehle ich allerdings allgemain ein non-type Argument, z.B.</p>
<pre><code class="language-cpp">template&lt;typename L, typename R, typename std::enable_if&lt;std::is_base_of&lt;a, L&gt;::value &amp;&amp; std::is_base_of&lt;a, R&gt;::value, int&gt;::type = 0&gt;
add_helper&lt;L, R&gt; operator+ (const L &amp;l, const R &amp;r)
{
    return add_helper&lt;L, R&gt;(l, r);
}
</code></pre>
<p>Auf diese Weise ist die Bedingung teil der Signatur des Templates, so dass es keine Probleme bereit, den operator noch anderweitig mit einer anderen Bedingung zu überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404764</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 20 Jun 2014 15:19:17 GMT</pubDate></item><item><title><![CDATA[Reply to SFINAE, hier in Ordnung? on Fri, 20 Jun 2014 15:32:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Kann das Konflikte geben mit anderen überladenen Operatoren?</p>
</blockquote>
<p>Das kann nur Konflikte mit anderen überladenen Operatoren ergeben, wenn du diese so auslegst, dass sie auch auf von <code>a</code> abgeleitete Klassen operieren. Ist einer der beiden Operanden nämlich nicht (sichtbar) von <code>a</code> abgeleitet, wird die Spezialisierung gar nicht zum Candidate Set hinzugefügt.</p>
<p>Edit: Frage hat sich geklärt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404768</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 20 Jun 2014 15:32:18 GMT</pubDate></item><item><title><![CDATA[Reply to SFINAE, hier in Ordnung? on Fri, 20 Jun 2014 16:04:49 GMT]]></title><description><![CDATA[<p>Alles klar, danke euch beiden. Mann, wie ich hacken in C++ liebe. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404778</guid><dc:creator><![CDATA[Apfelkuchen um 4]]></dc:creator><pubDate>Fri, 20 Jun 2014 16:04:49 GMT</pubDate></item></channel></rss>