<?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[Type ID mal Abartig anders. Meinungen dazu.]]></title><description><![CDATA[<p>Thema:<br />
TypeId mal anders.<br />
Was ist eure Meinung?</p>
<p>Gegeben ist:</p>
<pre><code class="language-cpp">class Base;
class A : public Base
class B : public Base

cBase *p = ?;
</code></pre>
<p>Ja Tausendfach durchgekaut ich weis. <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>Hier mal ein Abartiger Vorschlag:</p>
<p>Gut ich habe die Klasse Base, die weis nichts von den anderen Klassen.<br />
Man könnte jetzt rtti einsetzen aber wie man hier im Forum lernen kann<br />
ist das sehr verpönnt. (Geschwindigkeit usw.)</p>
<p>Vielleicht könnte man über eine Virtuelle Funktion eine Nummer zurück<br />
geben lassen. Nur wer Handhabt das mit den Nummern? Dazu müsste man wissen<br />
wie viele Klassen von der Base abgeleitet sind. Auch schlecht. Virtuelle<br />
Funktionen fallen eigentlich auch aus, da Base nichts weis von den anderen<br />
Klassen. Wer weis eigentlich das ein Objekt von Base abgeleitet ist?<br />
Eigentlich nur das Objekt selber. Wie könnte man das benutzen?</p>
<p>Nase reib ... Funken sprühen .... und die Idee ist da.</p>
<p>Hier meine Idee.<br />
Wir geben der Base Klasse eine leere Template Funktion. Diese dient<br />
dann als Reference.</p>
<pre><code class="language-cpp">class cBase
{
    template&lt; typename type &gt; void refFunc() {}
};
</code></pre>
<p>Jetzt gibt es eine virtuelle Funktion die ein Funktionspointer<br />
zurück gibt.</p>
<pre><code class="language-cpp">class cBase
{
    typedef void (cBase::*tRefFunc)();

    virtual tRefFunc getRefFunc() const { return cBase::refFunc&lt;cBase&gt;; }

    template&lt; typename type &gt; void refFunc() {}
};
</code></pre>
<p>Und als Letztes gibt es eine Template Funktion die zurück gibt<br />
ob es Klasse X oder Klasse Y ist, oder doch nur die Base.</p>
<pre><code class="language-cpp">class cBase
{
    template&lt; typename type &gt; bool bistDuEs() const;
};
</code></pre>
<p>Dies Funktion hollt sich jetzt über die virtuelle Funktion &quot;getRefFunc&quot;<br />
den Funktionspointer und vergleicht Ihn mit der, den Type entsprechenden<br />
refFunc. An besten ich zeig es mal.</p>
<pre><code class="language-cpp">typedef void (cBase::*tRefFunc)();
template&lt; typename type &gt; bool bistDuEs() const
{
    tRefFunc RefFunc_Soll = &amp;cBase::refFunc&lt;type&gt;;
    tRefFunc RefFunc_Ist = getRefFunc();
    return RefFunc_Soll == RefFunc_Ist;
}
</code></pre>
<p>Was muss das Objekt machen das von Base abgeleitet ist. Eigentlich<br />
nur die virtuelle Funktion getRefFunc überladen und den Pointer auf<br />
die refFunc der Base mit dem Template Parameter this als Rückgabewert<br />
zurückliefern.</p>
<pre><code class="language-cpp">class A : public cBase
{
    virtual tRefFunc getRefFunc() const { return cBase::refFunc&lt;A&gt;; }
};
</code></pre>
<p>Benutzen wird nun mal die Funktion &quot;bisDuEs&quot; in einen Beispiel.</p>
<pre><code class="language-cpp">class A : public cBase;
class B : public cBase;
class cBase *p = A;

p-&gt;bistDuEs&lt; A &gt;()
    {
        // hier holt sich die Funktion wie gefordert den
        // pointer der Reference Funktion mit Template Parameter
        // Klasse A
        tRefFunc RefFunc_Soll = &amp;cBase::refFunc&lt; A &gt;;

        // hier kommt der Pointer von der &quot;getRefFunc&quot;
        // Funktion. In unseren Fall ist dies von Klasse A
        // Überladen und liefert seinerseits den Pointer
        // von refFunc&lt; A &gt; zurück.
        tRefFunc RefFunc_Ist = getRefFunc();

        // Die beiden Pointer sind also gleich, deshalb gibt die
        // Funktion true zurück.
        return RefFunc_Soll == RefFunc_Ist;
    }

p-&gt;bistDuEs&lt; B &gt;()
    {
        // hier holt sich die Funktion wie gefordert den
        // pointer der Reference Funktion mit Template Parameter
        // Klasse A
        tRefFunc RefFunc_Soll = &amp;cBase::refFunc&lt; A &gt;;

        // hier kommt der Pointer von der &quot;getRefFunc&quot;
        // Funktion. In unseren Fall ist dies von Klasse B
        // Überladen und liefert seinerseits den Pointer
        // von refFunc&lt; B &gt; zurück.
        tRefFunc RefFunc_Ist = getRefFunc();

        // Die beiden Pointer sind also ungleich, deshalb gibt die
        // Funktion false zurück.
        return RefFunc_Soll == RefFunc_Ist;
    }
</code></pre>
<p>So sieht doch gut aus.</p>
<p>WARNUNG:<br />
Dieses Funktioniert nur wenn es nur jeweils eine Codestelle der<br />
Funktion &quot;refFunc&lt; type &gt;&quot; im Programm gibt.</p>
<p>Naja, vielleicht nicht ganz Praxis Tauglich, aber was meint Ihr dazu?</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274221/type-id-mal-abartig-anders-meinungen-dazu</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 17:10:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274221.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 21 Sep 2010 21:16:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Type ID mal Abartig anders. Meinungen dazu. on Tue, 21 Sep 2010 21:16:17 GMT]]></title><description><![CDATA[<p>Thema:<br />
TypeId mal anders.<br />
Was ist eure Meinung?</p>
<p>Gegeben ist:</p>
<pre><code class="language-cpp">class Base;
class A : public Base
class B : public Base

cBase *p = ?;
</code></pre>
<p>Ja Tausendfach durchgekaut ich weis. <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>Hier mal ein Abartiger Vorschlag:</p>
<p>Gut ich habe die Klasse Base, die weis nichts von den anderen Klassen.<br />
Man könnte jetzt rtti einsetzen aber wie man hier im Forum lernen kann<br />
ist das sehr verpönnt. (Geschwindigkeit usw.)</p>
<p>Vielleicht könnte man über eine Virtuelle Funktion eine Nummer zurück<br />
geben lassen. Nur wer Handhabt das mit den Nummern? Dazu müsste man wissen<br />
wie viele Klassen von der Base abgeleitet sind. Auch schlecht. Virtuelle<br />
Funktionen fallen eigentlich auch aus, da Base nichts weis von den anderen<br />
Klassen. Wer weis eigentlich das ein Objekt von Base abgeleitet ist?<br />
Eigentlich nur das Objekt selber. Wie könnte man das benutzen?</p>
<p>Nase reib ... Funken sprühen .... und die Idee ist da.</p>
<p>Hier meine Idee.<br />
Wir geben der Base Klasse eine leere Template Funktion. Diese dient<br />
dann als Reference.</p>
<pre><code class="language-cpp">class cBase
{
    template&lt; typename type &gt; void refFunc() {}
};
</code></pre>
<p>Jetzt gibt es eine virtuelle Funktion die ein Funktionspointer<br />
zurück gibt.</p>
<pre><code class="language-cpp">class cBase
{
    typedef void (cBase::*tRefFunc)();

    virtual tRefFunc getRefFunc() const { return cBase::refFunc&lt;cBase&gt;; }

    template&lt; typename type &gt; void refFunc() {}
};
</code></pre>
<p>Und als Letztes gibt es eine Template Funktion die zurück gibt<br />
ob es Klasse X oder Klasse Y ist, oder doch nur die Base.</p>
<pre><code class="language-cpp">class cBase
{
    template&lt; typename type &gt; bool bistDuEs() const;
};
</code></pre>
<p>Dies Funktion hollt sich jetzt über die virtuelle Funktion &quot;getRefFunc&quot;<br />
den Funktionspointer und vergleicht Ihn mit der, den Type entsprechenden<br />
refFunc. An besten ich zeig es mal.</p>
<pre><code class="language-cpp">typedef void (cBase::*tRefFunc)();
template&lt; typename type &gt; bool bistDuEs() const
{
    tRefFunc RefFunc_Soll = &amp;cBase::refFunc&lt;type&gt;;
    tRefFunc RefFunc_Ist = getRefFunc();
    return RefFunc_Soll == RefFunc_Ist;
}
</code></pre>
<p>Was muss das Objekt machen das von Base abgeleitet ist. Eigentlich<br />
nur die virtuelle Funktion getRefFunc überladen und den Pointer auf<br />
die refFunc der Base mit dem Template Parameter this als Rückgabewert<br />
zurückliefern.</p>
<pre><code class="language-cpp">class A : public cBase
{
    virtual tRefFunc getRefFunc() const { return cBase::refFunc&lt;A&gt;; }
};
</code></pre>
<p>Benutzen wird nun mal die Funktion &quot;bisDuEs&quot; in einen Beispiel.</p>
<pre><code class="language-cpp">class A : public cBase;
class B : public cBase;
class cBase *p = A;

p-&gt;bistDuEs&lt; A &gt;()
    {
        // hier holt sich die Funktion wie gefordert den
        // pointer der Reference Funktion mit Template Parameter
        // Klasse A
        tRefFunc RefFunc_Soll = &amp;cBase::refFunc&lt; A &gt;;

        // hier kommt der Pointer von der &quot;getRefFunc&quot;
        // Funktion. In unseren Fall ist dies von Klasse A
        // Überladen und liefert seinerseits den Pointer
        // von refFunc&lt; A &gt; zurück.
        tRefFunc RefFunc_Ist = getRefFunc();

        // Die beiden Pointer sind also gleich, deshalb gibt die
        // Funktion true zurück.
        return RefFunc_Soll == RefFunc_Ist;
    }

p-&gt;bistDuEs&lt; B &gt;()
    {
        // hier holt sich die Funktion wie gefordert den
        // pointer der Reference Funktion mit Template Parameter
        // Klasse A
        tRefFunc RefFunc_Soll = &amp;cBase::refFunc&lt; A &gt;;

        // hier kommt der Pointer von der &quot;getRefFunc&quot;
        // Funktion. In unseren Fall ist dies von Klasse B
        // Überladen und liefert seinerseits den Pointer
        // von refFunc&lt; B &gt; zurück.
        tRefFunc RefFunc_Ist = getRefFunc();

        // Die beiden Pointer sind also ungleich, deshalb gibt die
        // Funktion false zurück.
        return RefFunc_Soll == RefFunc_Ist;
    }
</code></pre>
<p>So sieht doch gut aus.</p>
<p>WARNUNG:<br />
Dieses Funktioniert nur wenn es nur jeweils eine Codestelle der<br />
Funktion &quot;refFunc&lt; type &gt;&quot; im Programm gibt.</p>
<p>Naja, vielleicht nicht ganz Praxis Tauglich, aber was meint Ihr dazu?</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955642</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Tue, 21 Sep 2010 21:16:17 GMT</pubDate></item><item><title><![CDATA[Reply to Type ID mal Abartig anders. Meinungen dazu. on Wed, 22 Sep 2010 06:34:00 GMT]]></title><description><![CDATA[<p>Lichtlein schrieb:</p>
<blockquote>
<p>Gut ich habe die Klasse Base, die weis nichts von den anderen Klassen.<br />
Man könnte jetzt rtti einsetzen aber wie man hier im Forum lernen kann<br />
ist das sehr verpönnt. (Geschwindigkeit usw.)</p>
</blockquote>
<p>Du meinst wohl eher <code>dynamic_cast</code> ? RTTI ist einfach nur Runtime Type Information. RTTI kannst du auch mit dem Schlüsselwort <code>typeid</code> verwenden:<br />
<a href="http://www.cplusplus.com/reference/std/typeinfo/type_info/" rel="nofollow">http://www.cplusplus.com/reference/std/typeinfo/type_info/</a></p>
<p>Das entspricht in etwa dem, was du hier machst.<br />
Es ist übrigens nicht einfach verpönt, sondern wie schon vielfach gesagt, ein Indiz für schlechtes Design, wenn man den <code>dynamic_cast</code> benötigt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955738</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 22 Sep 2010 06:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to Type ID mal Abartig anders. Meinungen dazu. on Wed, 22 Sep 2010 07:12:11 GMT]]></title><description><![CDATA[<p>Hallo, ich wollte eigentlich keine Diskusion über Dynamic Cast oder so, sondern es ging mir um die Idee, die Automatische Erzeugung von Funktionen durch den Compiler zu benutzen. (Template Code)</p>
<p>Es ist mehr eine &quot;Funktioniert das so&quot; Studie. Seht es einfach nur als Anregung. <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>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955749</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Wed, 22 Sep 2010 07:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to Type ID mal Abartig anders. Meinungen dazu. on Wed, 22 Sep 2010 07:32:31 GMT]]></title><description><![CDATA[<p>Lichtlein schrieb:</p>
<blockquote>
<p>Seht es einfach nur als Anregung. <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>
</blockquote>
<p>Anregung wofür? Es gibt ja bereits <code>typeid</code> . Sieh dir den Link an.</p>
<p>Oder willst du einfach nur wissen, ob dein Code funktionieren würde? Gründsätzlich wohl schon, aber ich würde empfehlen die Funktion &quot;bistDuEs&quot; als freie Funktion auszulagern. Als freie Funktion kannst du dann zwei anbieten:</p>
<ul>
<li><code>is_type&lt;T&gt;(Base&amp; base)</code></li>
<li><code>is_same_type(Base&amp; lhs, Base&amp; rhs)</code></li>
</ul>
<p>Auch würde ich das <code>typedef</code> anders nennen, nämlich zum Beispiel <code>type_id</code> <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="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955753</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 22 Sep 2010 07:32:31 GMT</pubDate></item><item><title><![CDATA[Reply to Type ID mal Abartig anders. Meinungen dazu. on Wed, 22 Sep 2010 07:40:12 GMT]]></title><description><![CDATA[<p>Probiers aus, dann siehste du ob es geht (sieht auf den ersten Blick so aus).<br />
Allerdings gibt dir ein dynamic_cast die gleiche Anwort auf deine Frage. Dein Design wird nicht schöner, wenn du ein Typeswitch mit etwas was ein dynamic_cast imitiert hast.<br />
Die Frage ist, wieso du überhaupt wissen musst ob es A oder B ist. Der Sinn der Ploymorphie ist ja gerade nicht wissen zu müssen ob es A oder B ist, bzw. gar nicht wissen zu müssen was A und B ist, sondern nur eine Schnittstelle zu kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955755</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 22 Sep 2010 07:40:12 GMT</pubDate></item><item><title><![CDATA[Reply to Type ID mal Abartig anders. Meinungen dazu. on Wed, 22 Sep 2010 08:31:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a><br />
Gute Idee mit dem Auslagern. Ist dann auch Flexibler und nicht so Classe Base abhänig.</p>
<p>Das Prinzip Funktioniert, das habe ich schon ausprobiert.</p>
<p>Experimentiere hier ein wenig mit &quot;Automatisch-Funktionalen&quot; Aspekten in C++ herum. Das mit der TypeId ist nur ein kleines Nebenprodukt meiner Überlegungen, nicht Praxis Relevant (Hatte ich aber schon erwähnt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955779</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Wed, 22 Sep 2010 08:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to Type ID mal Abartig anders. Meinungen dazu. on Wed, 22 Sep 2010 11:04:11 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Als ID-Generator finde ich die Idee des Methoden-Pointers generell recht gut (ich mag ja auch das safe-bool Idiom sehr :D).</p>
<p>Aber zur Implementierung hätte ich schon eine Frage:<br />
Bei der Optimierung des erzeugten Codes könnte der Compiler feststellen, dass alle &quot;void refFunc&lt;T&gt;()&quot; Methoden nichts tun und eigentlich unabhängig vom template-Parameter ist. Kann man also verhindern, dass 5 refFunc&lt;T&gt; - Methoden dann nicht auf einen einzigen Code-Block zeigen, der nur ein &quot;return&quot; beinhaltet ?<br />
Eventuell vorsichtig müsste man beim Portieren sein. Es gibt Compiler (damit mein ich vor allem den OpenWatcom), die die Form &amp;Class::Method&lt;T&gt; nicht verstehen können (leider <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> ).</p>
<p>Ein anderer Punkt ist die ID selbst, die bei jedem Kompiliervorgang dann anders aussehen kann. Die Praxis hat mir gezeigt, dass beim Bedarf einer ID für eine Klasse sich diese nicht mehr ändern sollte (zwecks Serialisierung ...). Ist aber hier nur ein Kommentar am Rande <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Ich selbst habe bei der ID-Frage schon allerlei Unsinn mit Makros, die den Klassennamen an einen Member hängen, angestellt. Leider sind string-Konstanten-Pointer absolut nicht eindeutig.<br />
Eines muss ich allerdings gestehen: Bei allen Versuchen dynamic_cast und RTTI abzulösen habe ich immer nur schlechtere bzw. schwächere Lösungen gefunden, als die, die vom Compiler erzeugt wurden. Wenn man sich Exceptions, Mehrfachvererbung und die Verkettung von Klassen ansieht, kommt man um den geringen Overhead von RTTI einfach nicht herum</p>
<p>lg XOR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955870</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Wed, 22 Sep 2010 11:04:11 GMT</pubDate></item><item><title><![CDATA[Reply to Type ID mal Abartig anders. Meinungen dazu. on Wed, 22 Sep 2010 11:23:46 GMT]]></title><description><![CDATA[<p>Die Adresse einer statischen Membervariable zurückzugeben wäre IMO viel einfacher, und erfüllt genau den selben Zweck.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955880</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 22 Sep 2010 11:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to Type ID mal Abartig anders. Meinungen dazu. on Wed, 22 Sep 2010 11:46:09 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23338">@xor</a></p>
<p>Der Compiler darf das gar nie nicht! :-). Kann er auch nicht. Wenn dann müste der Linker dieses machen. (Der weis aber noch weniger über den Code als der Compiler)</p>
<p>Für Serialisierung taugt das ganze nichts. Da hast Du schon recht, da gibt es bessere möglichkeiten.</p>
<p>Noch mal was zu dynamic_cast, rtti, Exceptions usw.<br />
Was hier in den Diskusionen leider immer wieder vergessen wird, ist das es nicht immer zur verfügung steht.</p>
<p>Einfach mal den gcc mit -nostdlib aufrufen... schon war es das mit den ganzen netten C++ zusätzen.</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955889</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Wed, 22 Sep 2010 11:46:09 GMT</pubDate></item></channel></rss>