<?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[Konvertierung zu abgeleiteter Klasse als Templatefunktion o.ä.?]]></title><description><![CDATA[<p>Hi,</p>
<p>folgendes:</p>
<pre><code>Class A
{
public:
A(int t):type(t){}
virtual ~A();

int type;//Oder welcher Typ auch immer
}

Class B
:public A
{
B()
:A(B_TYPE)
{}
}

//... andere Children von A

int main
{
    A* a = some_A_child_ptr;
    if(a-&gt;type == B_TYPE)
    {
       B* b = B::Convert(a); //Hierum gehts
       //...
    }
    else if(a-&gt;type == C_TYPE)
    {
       C* c = C::Convert(a); //Hierum gehts
       //...
    }
    //...
    return 0;
}
</code></pre>
<p>Es müsste doch möglich sein eine Templatekonvertierungsfunktion (o.ä.) zu bauen, die jedes Child von A erbt und entsprechend ihres eigenen Typs &quot;verwendet&quot;.</p>
<p>Irgendwas in der Art (kenne mich in dem Bereich leider noch nicht aus, daher vllt komplett unsinnig):</p>
<pre><code>class A
{
public:
 decltype(TYPE OF THIS) Convert(A* a)
 {
     return static_cast&lt;decltype(TYPE OF THIS)*&gt;(this);
 }
}
</code></pre>
<p>Ebenso, dass für jede abgeleitete Klasse entsprechend die Konvertierungsfunktion den Basisklassenzeiger in einen Childzeiger umwandelt.</p>
<p>Vielen Dank für jede Hilfe <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/topic/323119/konvertierung-zu-abgeleiteter-klasse-als-templatefunktion-o-ä</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 10:24:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323119.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Jan 2014 19:47:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konvertierung zu abgeleiteter Klasse als Templatefunktion o.ä.? on Sat, 18 Jan 2014 19:47:45 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>folgendes:</p>
<pre><code>Class A
{
public:
A(int t):type(t){}
virtual ~A();

int type;//Oder welcher Typ auch immer
}

Class B
:public A
{
B()
:A(B_TYPE)
{}
}

//... andere Children von A

int main
{
    A* a = some_A_child_ptr;
    if(a-&gt;type == B_TYPE)
    {
       B* b = B::Convert(a); //Hierum gehts
       //...
    }
    else if(a-&gt;type == C_TYPE)
    {
       C* c = C::Convert(a); //Hierum gehts
       //...
    }
    //...
    return 0;
}
</code></pre>
<p>Es müsste doch möglich sein eine Templatekonvertierungsfunktion (o.ä.) zu bauen, die jedes Child von A erbt und entsprechend ihres eigenen Typs &quot;verwendet&quot;.</p>
<p>Irgendwas in der Art (kenne mich in dem Bereich leider noch nicht aus, daher vllt komplett unsinnig):</p>
<pre><code>class A
{
public:
 decltype(TYPE OF THIS) Convert(A* a)
 {
     return static_cast&lt;decltype(TYPE OF THIS)*&gt;(this);
 }
}
</code></pre>
<p>Ebenso, dass für jede abgeleitete Klasse entsprechend die Konvertierungsfunktion den Basisklassenzeiger in einen Childzeiger umwandelt.</p>
<p>Vielen Dank für jede Hilfe <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/2378108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378108</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Sat, 18 Jan 2014 19:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu abgeleiteter Klasse als Templatefunktion o.ä.? on Sat, 18 Jan 2014 19:52:20 GMT]]></title><description><![CDATA[<pre><code>B *b = static_cast&lt;B*&gt;(a);
</code></pre>
<p>Aber Downcasts sind oft ein Zeichen von schlechtem Design.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378109</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 18 Jan 2014 19:52:20 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu abgeleiteter Klasse als Templatefunktion o.ä.? on Sat, 18 Jan 2014 19:57:08 GMT]]></title><description><![CDATA[<p>Ich weiss, dass das im allgemeinen der Konsens ist.<br />
Würde es in meinem Projekt gerne für eine Kommunikation zwischen einzelnen Teilen des Programms verwenden bzw. es einfach ausprobieren.</p>
<p>Zu deinem Lösungsvorschlag:</p>
<p>Das suche ich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
Wie man das im speziellen macht ist schon klar, ich würde nur gerne eine verallgemeinerte Methode in die Basisklasse einbauen, welche in den abgeleiteten Klassen automatisch einen Zeiger auf die Basisklasse in einen Zeiger auf die abgeleitete Klasse umwandelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378111</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Sat, 18 Jan 2014 19:57:08 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu abgeleiteter Klasse als Templatefunktion o.ä.? on Sat, 18 Jan 2014 20:13:29 GMT]]></title><description><![CDATA[<p>Namenloser324 schrieb:</p>
<blockquote>
<p>...ich würde nur gerne eine verallgemeinerte Methode in die Basisklasse einbauen, welche in den abgeleiteten Klassen automatisch einen Zeiger auf die Basisklasse in einen Zeiger auf die abgeleitete Klasse umwandelt.</p>
</blockquote>
<p>Das geht nicht vernünftig. Zielführender ist es zu überlegen wozu du einen Zeiger auf die abgeleitete Klasse brauchst. Wahrscheinlich willst du eine Memberfunktion aufrufen. Diese muss dann halt virtuell in der Basisklasse schon vorhanden sein.<br />
Alternativ einfach einen Container pro abgeleiteter Klasse benutzen und den Zeiger gar nicht erst in einen Basisklassenzeiger umwandeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378116</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Sat, 18 Jan 2014 20:13:29 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu abgeleiteter Klasse als Templatefunktion o.ä.? on Sat, 18 Jan 2014 20:13:51 GMT]]></title><description><![CDATA[<p>Namenloser324 schrieb:</p>
<blockquote>
<p>Das suche ich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
Wie man das im speziellen macht ist schon klar, ich würde nur gerne eine verallgemeinerte Methode in die Basisklasse einbauen, welche in den abgeleiteten Klassen automatisch einen Zeiger auf die Basisklasse in einen Zeiger auf die abgeleitete Klasse umwandelt.</p>
</blockquote>
<p>Das wandelt den Zeiger um.<br />
Wo ist der Unterschied ob du jetzt</p>
<pre><code>B *b = B::convert(a);
</code></pre>
<p>oder das schreibst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378117</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 18 Jan 2014 20:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu abgeleiteter Klasse als Templatefunktion o.ä.? on Sat, 18 Jan 2014 20:19:54 GMT]]></title><description><![CDATA[<p>Effektiv gibts keinen Unterschied, eben wegen des static_castes in der Wrapperfunktion.<br />
Ich finde es allerdings leserlicher und schöner. Desweiteren interessiert es mich, wie man mit C++-Mitteln in der abgeleiteten Klasse automatisch die passende Funktion generiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378118</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Sat, 18 Jan 2014 20:19:54 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu abgeleiteter Klasse als Templatefunktion o.ä.? on Sat, 18 Jan 2014 20:38:34 GMT]]></title><description><![CDATA[<p>Namenloser324 schrieb:</p>
<blockquote>
<p>Effektiv gibts keinen Unterschied, eben wegen des static_castes in der Wrapperfunktion.<br />
Ich finde es allerdings leserlicher und schöner. Desweiteren interessiert es mich, wie man mit C++-Mitteln in der abgeleiteten Klasse automatisch die passende Funktion generiert.</p>
</blockquote>
<p>Da das eine statische Funktion ist, geht das nicht so einfach.<br />
Du musst da schon in jeder Klasse explicit den Code hinschreiben.<br />
Alternativ auch folgender CRTP-Trick:</p>
<pre><code>template &lt;class Derived&gt;
class converter
{
public:
	template &lt;typename Base&gt;
	static decltype(static_cast&lt;Derived*&gt;(ptr)) convert(Base *ptr)
	{
		return static_cast&lt;Derived*&gt;(ptr);
	}

protected:
	~converter() noexcept = default;	
};
</code></pre>
<p>Das decltype als Rückgabewert spart mir ein hässliches enable_if&lt;is_base_of&lt;...&gt;&gt;.<br />
Nutzt du dann so:</p>
<pre><code>class B : public A, public converter&lt;B&gt;
{...};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2378120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378120</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 18 Jan 2014 20:38:34 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu abgeleiteter Klasse als Templatefunktion o.ä.? on Sat, 18 Jan 2014 20:41:15 GMT]]></title><description><![CDATA[<p>Hmm, das ist dann leider doch so &quot;umständlich&quot; bzw. hässlich in der klassendefinition das ich wohl zum simplen ungewrappten static_cast greife.</p>
<p>Vielen Dank für deine Hilfe <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/2378123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378123</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Sat, 18 Jan 2014 20:41:15 GMT</pubDate></item></channel></rss>