<?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[&amp;quot;Radikales Casten&amp;quot;]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es irgendeine Methode, mit der man versuchen kann, zwei <strong>beliebige</strong> Zeigertypen ineinander zu casten? Der Cast sollte sich wie ein dynamic_cast verhalten, aber keine Fehlermeldung beim Kompilieren bringen, wenn der Quelltyp nicht polymorph ist. In diesem Fall sollte dann einfach ein Nullzeiger dabei herauskommen.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class A
{
public:
};

class B : public A
{
public:
};

A* a = new B;
radical_cast&lt;B*&gt;(a) == 0; // Hier käme bei dynamic_cast die Fehlermeldung.

class Ap
{
public:
	virtual ~Ap() { }
};

class Bp : public Ap
{
public:
};

Ap* ap = new Bp;
radical_cast&lt;Bp*&gt;(ap) != 0; // Das sollte klappen.
</code></pre>
<p>Zumindest theoretisch sollte das doch machbar sein, da der Compiler ja schon erkennt, dass der Cast ungültig ist. Was ich will, ist, dass er dann aber keine Fehlermeldung ausgibt, sondern einfach einen Nullzeiger zurückliefern lässt. Dass das so direkt nicht geht, ist mir klar, aber vielleicht gibt es ja irgendetwas Boost-artiges für dieses Problem.</p>
<p>Hintergrund ist natürlich eine Template-Geschichte.<br />
Ich möchte im Template herausfinden, ob die verwendete Klasse von einer bestimmten anderen Klasse erbt (direkt oder über mehrere Ebenen). Dafür brauche ich diesen Cast.<br />
Oder gibt es einen Weg, ein Template so zu spezialisieren, dass es immer dann verwendet wird, wenn der verwendete Typ von einer bestimmten Klasse erbt?</p>
<p>Für einen Lösungsansatz wäre ich sehr dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/190749/quot-radikales-casten-quot</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 18:37:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/190749.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Aug 2007 13:33:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;Radikales Casten&amp;quot; on Sun, 26 Aug 2007 13:38:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es irgendeine Methode, mit der man versuchen kann, zwei <strong>beliebige</strong> Zeigertypen ineinander zu casten? Der Cast sollte sich wie ein dynamic_cast verhalten, aber keine Fehlermeldung beim Kompilieren bringen, wenn der Quelltyp nicht polymorph ist. In diesem Fall sollte dann einfach ein Nullzeiger dabei herauskommen.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class A
{
public:
};

class B : public A
{
public:
};

A* a = new B;
radical_cast&lt;B*&gt;(a) == 0; // Hier käme bei dynamic_cast die Fehlermeldung.

class Ap
{
public:
	virtual ~Ap() { }
};

class Bp : public Ap
{
public:
};

Ap* ap = new Bp;
radical_cast&lt;Bp*&gt;(ap) != 0; // Das sollte klappen.
</code></pre>
<p>Zumindest theoretisch sollte das doch machbar sein, da der Compiler ja schon erkennt, dass der Cast ungültig ist. Was ich will, ist, dass er dann aber keine Fehlermeldung ausgibt, sondern einfach einen Nullzeiger zurückliefern lässt. Dass das so direkt nicht geht, ist mir klar, aber vielleicht gibt es ja irgendetwas Boost-artiges für dieses Problem.</p>
<p>Hintergrund ist natürlich eine Template-Geschichte.<br />
Ich möchte im Template herausfinden, ob die verwendete Klasse von einer bestimmten anderen Klasse erbt (direkt oder über mehrere Ebenen). Dafür brauche ich diesen Cast.<br />
Oder gibt es einen Weg, ein Template so zu spezialisieren, dass es immer dann verwendet wird, wenn der verwendete Typ von einer bestimmten Klasse erbt?</p>
<p>Für einen Lösungsansatz wäre ich sehr dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352325</guid><dc:creator><![CDATA[TomasRiker]]></dc:creator><pubDate>Sun, 26 Aug 2007 13:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Radikales Casten&amp;quot; on Sun, 26 Aug 2007 14:07:23 GMT]]></title><description><![CDATA[<p>In boost gibt es polymorphic_cast und polymorphic_downcast.<br />
Kommt natürlich ganz darauf an was Du mit deinem Algorithmus erreichen willst.<br />
Für bestimmte Zwecke findet auch der Visitor pattern sein Anwendungsgebiet.</p>
<p>WX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352348</guid><dc:creator><![CDATA[WeaponX2007]]></dc:creator><pubDate>Sun, 26 Aug 2007 14:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Radikales Casten&amp;quot; on Sun, 26 Aug 2007 17:15:19 GMT]]></title><description><![CDATA[<p>TomasRiker schrieb:</p>
<blockquote>
<p>Oder gibt es einen Weg, ein Template so zu spezialisieren, dass es immer dann verwendet wird, wenn der verwendete Typ von einer bestimmten Klasse erbt?</p>
</blockquote>
<p>Für Funktionstemplates sollte so etwas möglich sein, für Klassentemplates aber habe ich da bisher nur seltsame Konstrukte gesehen, die sizeof() auf den Rückgabetyp einer mit einem Parameter aufgerufenen Funktion als konstanten Ausdruck verwendeten. Wenn dein Compiler so etwas schluckt, geht es vermutlich.</p>
<p><em>Edit:</em> Würde dir so etwas helfen?</p>
<pre><code class="language-cpp">template &lt;typename Base&gt;
	bool isBaseClass (Base* ptr)
{ return true; }
template &lt;typename Base&gt;
	bool isBaseClass (void* ptr)
{ return false; }

class Base { };
class Derived : public Base { };
class NotDerived { };

int main (void)
{
	Derived* d = new Derived;
	NotDerived* nd = new NotDerived;

	isBaseClass &lt;Base&gt; (d) == true;
	isBaseClass &lt;Base&gt; (nd) == false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1352449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352449</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 26 Aug 2007 17:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Radikales Casten&amp;quot; on Sun, 26 Aug 2007 17:18:32 GMT]]></title><description><![CDATA[<p>Die Aufgabe ist unzureichend spezifiziert. Im Übrigen sagt dir auch dynamic_cast nicht, ob eine Klasse von einer anderen erbt, sondern nur, ob das vollständige Objekt, auf das gezeigt wird, von beiden erbt bzw. mit diesen identisch ist - Stichwort cross-cast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352460</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 26 Aug 2007 17:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Radikales Casten&amp;quot; on Sun, 26 Aug 2007 17:39:44 GMT]]></title><description><![CDATA[<p>Danke, es hat sich erledigt.<br />
Der Ansatz von audacia war das, was ich gebraucht hatte.<br />
Manchmal ist die Lösung eben ganz simpel <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>
<p>Und ja, dynamic_cast war gar nicht das, was ich meinte ... sorry!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352481</guid><dc:creator><![CDATA[TomasRiker]]></dc:creator><pubDate>Sun, 26 Aug 2007 17:39:44 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Radikales Casten&amp;quot; on Sun, 26 Aug 2007 17:48:10 GMT]]></title><description><![CDATA[<p>boost::is_convertible&lt;T*,U*&gt; tut es auch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352489</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 26 Aug 2007 17:48:10 GMT</pubDate></item></channel></rss>