<?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[Nur bei bestimmten template-Parametern kompilieren]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe mehrere Klassen a, b, ... die alle von einer Klasse small abgeleitet sind:</p>
<pre><code class="language-cpp">class small {};
class a : public small {};
class b : public small {};
// usw
</code></pre>
<p>Und ich habe mehrere Klassen A, B, ... die alle von einer Klasse huge abgeleitet sind:</p>
<pre><code class="language-cpp">class huge {};
class A : public huge {};
class B : public huge {};
// usw
</code></pre>
<p>Außerdem habe ich eine template-Klasse foo, die eine Methode operator= besitzt:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class foo
{
public:
  foo&lt;T&gt; &amp;operator=(foo&lt;T&gt; &amp;f) {}
};
</code></pre>
<p>Nun soll eine Zuweisung genau dann kompilierbar sein, wenn beide template-Parameter von derselben Basisklasse abgeleitet wurden:</p>
<pre><code class="language-cpp">int main()
{
  foo&lt;a&gt; fooa1, fooa2;
  foo&lt;b&gt; foob1;
  foo&lt;A&gt; fooA1;

  // ok
  fooa1 = fooa2;
  foob1 = fooa2;

  // !ok
  fooA1 = fooa2;

  return 0;
}
</code></pre>
<p>Wie könnte ich das realisieren?</p>
<p>Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201065/nur-bei-bestimmten-template-parametern-kompilieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 16:59:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201065.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Dec 2007 18:49:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nur bei bestimmten template-Parametern kompilieren on Sun, 23 Dec 2007 18:49:19 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe mehrere Klassen a, b, ... die alle von einer Klasse small abgeleitet sind:</p>
<pre><code class="language-cpp">class small {};
class a : public small {};
class b : public small {};
// usw
</code></pre>
<p>Und ich habe mehrere Klassen A, B, ... die alle von einer Klasse huge abgeleitet sind:</p>
<pre><code class="language-cpp">class huge {};
class A : public huge {};
class B : public huge {};
// usw
</code></pre>
<p>Außerdem habe ich eine template-Klasse foo, die eine Methode operator= besitzt:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class foo
{
public:
  foo&lt;T&gt; &amp;operator=(foo&lt;T&gt; &amp;f) {}
};
</code></pre>
<p>Nun soll eine Zuweisung genau dann kompilierbar sein, wenn beide template-Parameter von derselben Basisklasse abgeleitet wurden:</p>
<pre><code class="language-cpp">int main()
{
  foo&lt;a&gt; fooa1, fooa2;
  foo&lt;b&gt; foob1;
  foo&lt;A&gt; fooA1;

  // ok
  fooa1 = fooa2;
  foob1 = fooa2;

  // !ok
  fooA1 = fooa2;

  return 0;
}
</code></pre>
<p>Wie könnte ich das realisieren?</p>
<p>Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425323</guid><dc:creator><![CDATA[Schablonenmann]]></dc:creator><pubDate>Sun, 23 Dec 2007 18:49:19 GMT</pubDate></item><item><title><![CDATA[Reply to Nur bei bestimmten template-Parametern kompilieren on Sun, 23 Dec 2007 21:40:15 GMT]]></title><description><![CDATA[<p>Falls es bei den beiden Basen small und huge bleibt, wäre dies ein Versuch wert:</p>
<pre><code class="language-cpp">#include &lt;boost/utility/enable_if.hpp&gt;
#include &lt;boost/type_traits/is_base_of.hpp&gt;
#include &lt;boost/mpl/logical.hpp&gt;

template&lt;class T&gt; class foo
{
public:
    template&lt; typename U &gt;
    typename boost::enable_if&lt; 
        typename boost::mpl::or_&lt; 
            typename boost::mpl::and_&lt; typename boost::is_base_of&lt; T, small &gt;, typename boost::is_base_of&lt; U, small &gt; &gt;,
            typename boost::mpl::and_&lt; typename boost::is_base_of&lt; T, huge &gt;, typename boost::is_base_of&lt; U, huge &gt; &gt;
        &gt;, foo&lt;T&gt;&amp; &gt;::type 
        operator=( const foo&lt;U&gt;&amp; f ) 
    {
        return *this;
    }
};
</code></pre>
<p>Leider übersetzt er dann den Ausdruck</p>
<pre><code class="language-cpp">foob1 = fooa2;
</code></pre>
<p>auch nicht, warum .. das habe ich noch nicht verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
:xmas2: Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425391</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 23 Dec 2007 21:40:15 GMT</pubDate></item><item><title><![CDATA[Reply to Nur bei bestimmten template-Parametern kompilieren on Sun, 23 Dec 2007 22:05:29 GMT]]></title><description><![CDATA[<p>ja, das grundsätzliche problem ist, dass man die basisklassen kennen müsste. oder der klassenhierarchie irgendwie informationen über ihre vererbungshierarchie mitgeben. aber das ist beides nicht ganz sauber.</p>
<p>hier auch ein relativ hässlicher workaround von mir:</p>
<pre><code class="language-cpp">#define CHECK_BASE(base)template &lt;class U&gt; \
   foo &amp;assign_check (foo&lt;U&gt; const &amp;f, base*, base*) \
   { return do_assign (f); }

template&lt;class T&gt; class foo
{
public:
   foo &amp;operator=(foo const &amp;f) { return *this; }

   template &lt;class U&gt;
   foo &amp;operator=(foo&lt;U&gt; const &amp;f)
   {
      assign_check (f, static_cast&lt;T*&gt;(0), static_cast&lt;U*&gt;(0));
   }

private:
   CHECK_BASE (small)
   CHECK_BASE (huge)

   template &lt;class U&gt;
   foo &amp;do_assign (foo&lt;U&gt; const &amp;f)
   {
      //...
      return *this;
   }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1425400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425400</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sun, 23 Dec 2007 22:05:29 GMT</pubDate></item><item><title><![CDATA[Reply to Nur bei bestimmten template-Parametern kompilieren on Sun, 23 Dec 2007 22:23:18 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Leider übersetzt er dann den Ausdruck</p>
<pre><code class="language-cpp">foob1 = fooa2;
</code></pre>
<p>auch nicht, warum .. das habe ich noch nicht verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
:xmas2: Werner</p>
</blockquote>
<p>Weil du die Templateargumente vertauscht hast <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="😉"
    /> sind auch ein paar typenames zuviel:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class foo
{
    typedef typename boost::mpl::if_&lt;
        boost::is_base_of&lt; small, T &gt;,
        small,
        typename boost::mpl::if_&lt;
            boost::is_base_of&lt; huge, T &gt;,
            huge,
            void
        &gt;::type
    &gt;::type base; 
public:
    foo();
    template&lt;typename U&gt;
    foo(const foo&lt;U&gt;&amp;, typename boost::enable_if&lt; boost::is_base_of&lt; base, U &gt; &gt;::type* = 0);
};
</code></pre>
<p>Wenn man noch mehr Basisklassen hat, wäre eine extra Metafunktion sinnvoll, um das ganz nicht in verschachtelten if_s zu ersticken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425412</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 23 Dec 2007 22:23:18 GMT</pubDate></item><item><title><![CDATA[Reply to Nur bei bestimmten template-Parametern kompilieren on Mon, 24 Dec 2007 15:01:41 GMT]]></title><description><![CDATA[<p>Vielen Dank! :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425656</guid><dc:creator><![CDATA[Schablonenmann]]></dc:creator><pubDate>Mon, 24 Dec 2007 15:01:41 GMT</pubDate></item></channel></rss>