<?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[Spezialisierung von Template: Abgeleitete Klasse]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgenden Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
void init(T&amp; t){
        std::cout &lt;&lt; &quot;no init&quot; &lt;&lt; std::endl;
}

class A{

};

class B : public A{

};

template&lt;&gt;
void init(A&amp; t){
        std::cout &lt;&lt; &quot;init my A object&quot; &lt;&lt; std::endl;
}

int main(){
        A a;
        init(a);
        B b;
        init(b);
        return 0;
}
</code></pre>
<p>Die Ausgebe dieses Codes ist:</p>
<pre><code>init my A object
no init
</code></pre>
<p>Ich hätte aber gerne, dass er auch für B die A-spezifische Funktion aufruft,<br />
da es sich ja auch um ein A handelt.</p>
<p>Klar, kann ich in diesem Fall casten, aber krieg ich es auch ohne explizites<br />
Casten hin, denn ich befinde mich in meinem komplexeren Bsp. in einem Template,<br />
wo ich folglich nicht einfach casten kann.</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270007/spezialisierung-von-template-abgeleitete-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 20:14:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270007.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Jul 2010 11:24:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Spezialisierung von Template: Abgeleitete Klasse on Mon, 05 Jul 2010 11:24:24 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgenden Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
void init(T&amp; t){
        std::cout &lt;&lt; &quot;no init&quot; &lt;&lt; std::endl;
}

class A{

};

class B : public A{

};

template&lt;&gt;
void init(A&amp; t){
        std::cout &lt;&lt; &quot;init my A object&quot; &lt;&lt; std::endl;
}

int main(){
        A a;
        init(a);
        B b;
        init(b);
        return 0;
}
</code></pre>
<p>Die Ausgebe dieses Codes ist:</p>
<pre><code>init my A object
no init
</code></pre>
<p>Ich hätte aber gerne, dass er auch für B die A-spezifische Funktion aufruft,<br />
da es sich ja auch um ein A handelt.</p>
<p>Klar, kann ich in diesem Fall casten, aber krieg ich es auch ohne explizites<br />
Casten hin, denn ich befinde mich in meinem komplexeren Bsp. in einem Template,<br />
wo ich folglich nicht einfach casten kann.</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921551</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 05 Jul 2010 11:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung von Template: Abgeleitete Klasse on Mon, 05 Jul 2010 12:07:35 GMT]]></title><description><![CDATA[<p>So in etwa:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include  &lt;boost/type_traits/is_base_of.hpp&gt;

class A
{

};

class B : public A
{

};

class C
{
};

template&lt;typename T, bool&gt;
struct HasBase;

template&lt;typename T&gt;
struct HasBase&lt;T, true&gt;
{
    static void init(T &amp; t)
    {
        std::cout &lt;&lt; &quot;init my A object&quot; &lt;&lt; std::endl;
    }
};

template&lt;typename T&gt;
struct HasBase&lt;T, false&gt;
{
    static void init(T &amp; t)
    {
        std::cout &lt;&lt; &quot;no init&quot; &lt;&lt; std::endl;
    }
};

template&lt;typename T&gt;
void init(T&amp; t)
{
    HasBase&lt;T, boost::is_base_of&lt;A, T&gt;::value &gt;::init(t);
}

int main()
{
    A a;
    init(a);
    B b;
    init(b);
    C c;
    init(c);

    return 0;
}
</code></pre>
<p><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="😕"
    /></p>
<p>PS: Ist allerdings jetzt nur partiell spezialisiert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921584</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 05 Jul 2010 12:07:35 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung von Template: Abgeleitete Klasse on Mon, 05 Jul 2010 12:18:11 GMT]]></title><description><![CDATA[<p>Danke Tachyon!</p>
<p>Interessant, allerdings funktioniert das (wohl) nicht, wenn ich verschiedene<br />
Vererbungen habe...</p>
<p>also wenn B von A ableitet und D von C und ich jeweils eine init für A und C habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921595</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 05 Jul 2010 12:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung von Template: Abgeleitete Klasse on Mon, 05 Jul 2010 12:21:38 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Danke Tachyon!</p>
<p>Interessant, allerdings funktioniert das (wohl) nicht, wenn ich verschiedene<br />
Vererbungen habe...</p>
<p>also wenn B von A ableitet und D von C und ich jeweils eine init für A und C habe.</p>
</blockquote>
<p>Nicht ohne zusätzlichen Code, nein. Aber das ist bei Spezialisierung nun einmal so (auch bei dem, was Du versucht hast, wenn es denn gehen würde).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921596</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 05 Jul 2010 12:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung von Template: Abgeleitete Klasse on Mon, 05 Jul 2010 12:44:19 GMT]]></title><description><![CDATA[<p>Danke Tachyon!</p>
<p>Dann werde ich es wohl so lösen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A{};
class B : public A{};
class C{};
class D : public C{};

void initInternal(A* t){
        std::cout &lt;&lt; &quot;init my A object&quot; &lt;&lt; std::endl;
}

void initInternal(C* t){
        std::cout &lt;&lt; &quot;init my C object&quot; &lt;&lt; std::endl;
}

void initInternal(void* t){
        std::cout &lt;&lt; &quot;no init&quot; &lt;&lt; std::endl;
}

template&lt;typename T&gt;
void init(T&amp; t){
        initInternal(&amp;t);
}

int main(){
        A a;
        init(a);
        B b;
        init(b);
        C c;
        init(c);
        D d;
        init(d);
        return 0;
}
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>init my A object<br />
init my A object<br />
init my C object<br />
init my C object</p>
</blockquote>
<p>Auch wenn die Deklarationen von</p>
<pre><code class="language-cpp">void initInternal(A* t);
void initInternal(C* t);
</code></pre>
<p>vor</p>
<pre><code class="language-cpp">template&lt;typename T&gt; 
void init(T&amp; t); // EDIT: Hier stand die falsche Funktion
</code></pre>
<p>stehen müssen (zumindest, wenn A und C in einem anderen(?) namespace sind)</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921609</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 05 Jul 2010 12:44:19 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung von Template: Abgeleitete Klasse on Mon, 05 Jul 2010 12:55:24 GMT]]></title><description><![CDATA[<p>Nachtrag:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class C{};
class D : public C{};

void initInternal(void* t){
        std::cout &lt;&lt; &quot;no init&quot; &lt;&lt; std::endl;
}

template&lt;typename T&gt;
void init(T&amp; t){
        initInternal(&amp;t);
}

namespace csp{
class A{};
class B : public A{};
void initInternal(A* t);
}

void csp::initInternal(csp::A* t){
        std::cout &lt;&lt; &quot;init my A object&quot; &lt;&lt; std::endl;
}

void initInternal(C* t){
        std::cout &lt;&lt; &quot;init my C object&quot; &lt;&lt; std::endl;
}

int main(){
        csp::A a;
        init(a);
        csp::B b;
        init(b);
        C c;
        init(c);
        D d;
        init(d);
        return 0;
}
</code></pre>
<p>Wenn die Funktion im gleichen Namespace ist, klappt es auch ohne vorherige<br />
Deklaration. <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/1921619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921619</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 05 Jul 2010 12:55:24 GMT</pubDate></item></channel></rss>