<?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[virtual template member function workaround gesucht]]></title><description><![CDATA[<p>Gegeben sei folgende KlassenStruktur, auf das nötigste reduziert.<br />
Ein gewachsenes System mit gewissen Designschwächen.</p>
<pre><code class="language-cpp">class Skill {};
class ASkill : public Skill {};
class BSkill : public Skill {};
// 100 weitere, mehrere Veerbungsebenen

class Container
{
  std::vector&lt;Skill*&gt; skills;

  template &lt;typename T&gt; bool has() 
  {
    for_each(skill, skills)
    {
       // hier liegt das Problem
       if (dynamic_cast&lt;T*&gt;(skill) != 0 )
       { return true; }
    }
    return false;
  }
}

main(...)
{
  Container c; // wird initialisiert etc.
  ///...
  if (c-&gt;has&lt;ASkill&gt;())
  {
    // whatever
  }
}
</code></pre>
<p>Funktioniert auch alles soweit ganz gut.<br />
Bei realisitischem Datenbestand stellt sich allerdings heraus, dass das Programm ein Großteil der CPU-Zeit in der has-Funktion im <strong>dynamic_cast</strong> verbringt.</p>
<p>Nun muss das Gesamt-System irgendwie verbessert werden. Ziel des ganzen wäre es den dynamic_cast zu eliminieren und die Abfrage schneller zu machen.<br />
Mit dem CRTP und boost::is_same komme ich nicht weiter, naja und virtual template member functions gehen eben auch nicht.<br />
Vielleicht habt ihr eine passende Idee.</p>
<p>Erlaubt ist C++ (leider kein c++0x) und boost.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301873/virtual-template-member-function-workaround-gesucht</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 15:24:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301873.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Apr 2012 14:20:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 14:20:25 GMT]]></title><description><![CDATA[<p>Gegeben sei folgende KlassenStruktur, auf das nötigste reduziert.<br />
Ein gewachsenes System mit gewissen Designschwächen.</p>
<pre><code class="language-cpp">class Skill {};
class ASkill : public Skill {};
class BSkill : public Skill {};
// 100 weitere, mehrere Veerbungsebenen

class Container
{
  std::vector&lt;Skill*&gt; skills;

  template &lt;typename T&gt; bool has() 
  {
    for_each(skill, skills)
    {
       // hier liegt das Problem
       if (dynamic_cast&lt;T*&gt;(skill) != 0 )
       { return true; }
    }
    return false;
  }
}

main(...)
{
  Container c; // wird initialisiert etc.
  ///...
  if (c-&gt;has&lt;ASkill&gt;())
  {
    // whatever
  }
}
</code></pre>
<p>Funktioniert auch alles soweit ganz gut.<br />
Bei realisitischem Datenbestand stellt sich allerdings heraus, dass das Programm ein Großteil der CPU-Zeit in der has-Funktion im <strong>dynamic_cast</strong> verbringt.</p>
<p>Nun muss das Gesamt-System irgendwie verbessert werden. Ziel des ganzen wäre es den dynamic_cast zu eliminieren und die Abfrage schneller zu machen.<br />
Mit dem CRTP und boost::is_same komme ich nicht weiter, naja und virtual template member functions gehen eben auch nicht.<br />
Vielleicht habt ihr eine passende Idee.</p>
<p>Erlaubt ist C++ (leider kein c++0x) und boost.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199084</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Thu, 05 Apr 2012 14:20:25 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 14:27:52 GMT]]></title><description><![CDATA[<p>Jeder Skill bekommt eine ID und du musst nur noch IDs vergleichen.</p>
<p>templates bringen dir nichts wenn du zur Laufzeit SKills austauschen können willst. Wenn Skills aber schon zur Compiletime feststehen, dann können wir was mit template Magie basteln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199089</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 05 Apr 2012 14:27:52 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 16:39:33 GMT]]></title><description><![CDATA[<p>Wenn die Hauptzeit in dieser Funktion liegt und weniger bei Hinzufügen/Entfernen, könntest du auch für jeden Typ einen Referenzzähler einbauen und dann beim Abfragen auf 0 vergleichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199128</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 05 Apr 2012 16:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 17:00:49 GMT]]></title><description><![CDATA[<p>C++ kennt kein for_each als Sprachkonstrukt und main muss int zurückgeben. Hässlicher MSVC Schrott.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199132</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 05 Apr 2012 17:00:49 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 18:36:48 GMT]]></title><description><![CDATA[<p>Wieso kannst du nicht einfach zusätzliche Container für deine ASkill und BSkill Objekte machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199149</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 05 Apr 2012 18:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 18:39:10 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Wieso kannst du nicht einfach zusätzliche Container für deine ASkill und BSkill Objekte machen?</p>
</blockquote>
<p>nurf schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// 100 weitere, mehrere Veerbungsebenen
</code></pre>
</blockquote>
<p>Bisschen unschön.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199150</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 05 Apr 2012 18:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 18:41:03 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18674">@nurf</a>: Warum genau musst du denn überhaupt rausfinden ob im Container ein ASkill drin ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199152</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 05 Apr 2012 18:41:03 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 18:42:24 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18674">@nurf</a>: Warum genau musst du denn überhaupt rausfinden ob im Container ein ASkill drin ist?</p>
</blockquote>
<p>Vermutlich will er ein Item o.ä. hinzufügen, falls der Spieler eine gewisse Fähigkeit besitzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199153</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 05 Apr 2012 18:42:24 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 18:44:25 GMT]]></title><description><![CDATA[<p>Pi:</p>
<pre><code>error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.
</code></pre>
<p>Aber gut, dass du maulst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199154</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 05 Apr 2012 18:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 18:59:08 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Pi:</p>
<pre><code>error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.
</code></pre>
<p>Aber gut, dass du maulst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Da hier ein C++-Forum ist, darf er maulen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2199166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199166</guid><dc:creator><![CDATA[C++Forum]]></dc:creator><pubDate>Thu, 05 Apr 2012 18:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 19:04:41 GMT]]></title><description><![CDATA[<p>C++Forum schrieb:</p>
<blockquote>
<p>Da hier ein C++-Forum ist, darf er maulen <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>
</blockquote>
<p>Natürlich darf man sich über main ohne expliziten Rückgabewert beschweren. Das als &quot;hässlichen MSVC-Schrott&quot; abzutun, ist aber unüberlegter Unsinn, weil der VC das gar nicht schluckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199169</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 05 Apr 2012 19:04:41 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 19:57:22 GMT]]></title><description><![CDATA[<p>Das bezog sich auch auf for_each du Pfeife. Lern Texte verstehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199199</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 05 Apr 2012 19:57:22 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:02:24 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Das bezog sich auch auf for_each du Pfeife. Lern Texte verstehen.</p>
</blockquote>
<p><a href="http://msdn.microsoft.com/en-us/library/c4x1w65f.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/c4x1w65f.aspx</a> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2199203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199203</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:02:24 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:05:10 GMT]]></title><description><![CDATA[<p>Geb ich gleich mal an dich weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199204</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:05:10 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:14:05 GMT]]></title><description><![CDATA[<p>Mir ist schon klar was du gemeint hast.</p>
<p>Aber bevor du dich hier so aufspielst, solltest du erstmal deine eigenen Texte fixen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199208</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:14:05 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:34:01 GMT]]></title><description><![CDATA[<p>Vielleicht hast du auch einfach nur nicht verstanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199214</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:44:25 GMT]]></title><description><![CDATA[<p>Du meintest wohl dass MSVC noch nicht die neue range-based for Loop unterstützt!?<br />
Denn for_each ist Teil der Standardbibliothek und das unterstützt es natürlich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199220</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:45:58 GMT]]></title><description><![CDATA[<p>Schritt 1: Code des TE nochmal ansehen.<br />
Schritt 2: Stichwort: Extension</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199221</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:45:58 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:47:27 GMT]]></title><description><![CDATA[<p>Versuch mal folgendes, um der rtti Beine zu machen:</p>
<pre><code class="language-cpp">inline unsigned int next_id()
{
    static unsigned int current_id = 1;

    return current_id++;
}
template&lt; class Type &gt;
class t_id
{
    static const unsigned int value;
};
template&lt; class Type &gt;
const unsigned int t_id&lt; Type &gt;::value = next_id();
</code></pre>
<p>t_id&lt; X &gt;::value ist jetzt für jede Klasse einzigartig (Achtung: funktioniert vermutlich nicht, wenn dlls im Spiel sind).<br />
Jetzt kannst du noch die Suche von O( n ) auf O( 1 ) bringen:<br />
Statt linearer Suche verwendest du ein Hilfsarray. lookup_vector[ t_id&lt; Type &gt;::value ] soll die Anzahl der Objekte eines bestimmten Typs beinhalten. Dazu muss sich jedes Objekt in dem lookup_vector registrieren (inklusive aller base classes!), wenn es in den Container aufgenommen wird und abmelden, wenn es entfernt wird:</p>
<pre><code class="language-cpp">template&lt; class BaseType , class DerivedType &gt;
class derived_helper
  : public BaseType
{
public:
    static void add_indices( std::vector&lt; unsigned int &gt;&amp; lookup_vector )
    {
        ++lookup_vector[ t_id&lt; DerivedType &gt;::value ];
        BaseType::add_indices( lookup_vector );
    }
    static void remove_indices( ... )
    {
         ...
    }
};
</code></pre>
<p>Wenn du davor hattest</p>
<pre><code class="language-cpp">A;
B : A;
</code></pre>
<p>machst du jetzt halt</p>
<pre><code class="language-cpp">A;
B : derived_helper&lt; A , B &gt;
</code></pre>
<p>Du musst also die alte codebase verändern, darum kommst du wohl nicht rum (sind aber minimale Änderungen, denke ich).<br />
Wenn du jetzt ein Objekt zu deinem Container hinzufügst, rufst du für den jeweiligen Type eben die add_indices funktion mit deinem std::vector&lt; unsigned int &gt; lookup_vector auf, wenn du eines entfernst die remove_indices funktion (Anm.: Falls du Objekte über einen base pointer übergibst muss die Funktion virtuell und nicht statisch sein).<br />
Deine has&lt; T &gt; funktion wird dann einfach ein</p>
<pre><code class="language-cpp">template&lt; class Type &gt;
bool has()
{
    return lookup_vector[ t_id&lt; Type &gt;::value ] != 0;
}
</code></pre>
<p>Statt einem lookup_vector kann man denke ich auch eine andere Datenstruktur verwenden, beispielsweise ein set. Dadurch gewinnt man vielleicht etwas Speicher, verliert aber Zeit und hat wieder beim eine binary search drinnen, verliert also O( 1 ). Ist davon abhängig, wie viele verschiedene Typen tatsächlich im container gespeichert werden, was sinnvoller ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199225</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:47:27 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:48:03 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6496">@dot</a>: Der Code von nurf erinnert eher an etwas wie das:</p>
<pre><code class="language-cpp">#define for_each(i, l) \
    for (__decltype((l).begin()) i=(l).begin(), i##_end=(l).end();
         i != i##_end; ++i)
</code></pre>
<p>So nutzt nurf den Wurf:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; bool has()
  {
    for_each(skill, skills)
    {
       // hier liegt das Problem
       if (dynamic_cast&lt;T*&gt;(skill) != 0 )
       { return true; } // Guck mal da: returniert aus has()
    }
    return false;
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2199226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199226</guid><dc:creator><![CDATA[sprachkonstrukt]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:48:03 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:52:05 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Schritt 1: Code des TE nochmal ansehen.<br />
Schritt 2: Stichwort: Extension</p>
</blockquote>
<p>MSVC hat keine <code>for_each</code> Extension, nur eine <code>for each</code> Extension. Das muss also irgendein Makro sein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199227</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:52:05 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 20:54:56 GMT]]></title><description><![CDATA[<p>Abgesehen davon:</p>
<blockquote>
<pre><code class="language-cpp">main(...)
</code></pre>
</blockquote>
<p>Die &quot;...&quot; stören niemanden oder was? Vielleicht darüber nachgedacht, dass der TE nur Pseudocode gepostet hat, um zu veranschaulichen, worum es geht? Statt Hilfe kommt nur dummes Gelaber von language lawyern (naja, eigentlich nur einem) der keinem was bringt... wirklich unnötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199229</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Thu, 05 Apr 2012 20:54:56 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 21:13:34 GMT]]></title><description><![CDATA[<p>Nur mal so ne Idee, ungetestet (weiss nichtmal ob es 1:1 so compiliert), aber müsste so oder so ähnlich hinhauen:</p>
<pre><code class="language-cpp">class Container 
{ 
    std::vector&lt;Skill*&gt; skills; 

    typedef std::pair&lt;intptr_t, intptr_t&gt; SkillMapKey;
    typedef std::map&lt;SkillMapKey, bool&gt; SkillMap;  // evtl. hash_map verwenden wenns hier wirklich viele Einträge geben sollte
    SkillMap skillMap;

    SkillMapKey make_skill_map_key(Skill const* concreteSkill, type_info const&amp; interfaceType)
    {
        return SkillMapKey(
            reinterpret_cast&lt;intptr_t&gt;(&amp;typeid(*concreteSkill),
            reinterpret_cast&lt;intptr_t&gt;(&amp;interfaceType));
    }

    template &lt;typename T&gt; bool has(Skill* concreteSkill)
    {
        SkillMapKey key = make_skill_map_key(concreteSkill, typeid(T));

        SkillMap::iterator it = skillMap.find(key);
        if (it != skillMap.end())
            return it-&gt;second;
        else
        {
            bool result = dynamic_cast&lt;T*&gt;(concreteSkill) != 0;
            skillMap[key] = result;
            return result;
        }
    }

    template &lt;typename T&gt; bool has() 
    { 
        for_each(skill, skills) 
        { 
            // hier jetzt hoffentlich schneller
            if (has&lt;T&gt;(skill)) 
                return true;
        } 

        return false; 
    } 
}
</code></pre>
<p>Wenn der Inhalt des Containers recht statisch ist könnte man natürlich noch weiter optimieren, so dass die meisten Abfragen überhaupt keine Schleife mehr brauchen.</p>
<p>ps: Falls &quot;Skill&quot; Objekte in DLLs/SOs implementiert sind, die dynamisch geladen <s>oder</s> und entladen werden könnte das Probleme machen. Davon abgesehen müsste es mMn. funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199231</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 05 Apr 2012 21:13:34 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 21:06:40 GMT]]></title><description><![CDATA[<p>GorbGorb schrieb:</p>
<blockquote>
<p>Statt Hilfe kommt nur dummes Gelaber von language lawyern (naja, eigentlich nur einem) der keinem was bringt... wirklich unnötig.</p>
</blockquote>
<p>Ja. Das Problem ist nur, dass man hier ohne genauere Information über die konkrete Anwendung keine hilfreiche Antwort geben kann. Denn eine gute Lösung für das Problem würde vermutlich eine grundlegende Änderung des Designs bedeuten. Und wie diese jetzt genau aussehen könnte kann man so allgemein nicht sagen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199235</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 05 Apr 2012 21:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 21:17:46 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>GorbGorb schrieb:</p>
<blockquote>
<p>Statt Hilfe kommt nur dummes Gelaber von language lawyern (naja, eigentlich nur einem) der keinem was bringt... wirklich unnötig.</p>
</blockquote>
<p>Ja. Das Problem ist nur, dass man hier ohne genauere Information über die konkrete Anwendung keine hilfreiche Antwort geben kann. Denn eine gute Lösung für das Problem würde vermutlich eine grundlegende Änderung des Designs bedeuten. Und wie diese jetzt genau aussehen könnte kann man so allgemein nicht sagen...</p>
</blockquote>
<p>Brauchst dich nicht angegriffen fühlen, ich hab dich ja gar nicht gemeint <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="🙂"
    /><br />
Der TE meinte ja, es sei ein gewachsenes System, er kann vom design her wohl nicht viel ändern ohne Arbeit. Sein Problem ist diese Funktion, und ich denke da kann man ja was tun (siehe hustbaers und meine Vorschläge).</p>
<p>EDIT: hustbaer, wenn ich das richtig verstanden habe spart <code>has(Skill* concreteSkill)</code> den dynamic cast, wenn concreteSkill eines der gesuchten Objekte ist, oder? Dürften nicht vielmehr die dynamic_casts mit negativem Ergebnis das bottleneck sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199238</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Thu, 05 Apr 2012 21:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to virtual template member function workaround gesucht on Thu, 05 Apr 2012 21:16:07 GMT]]></title><description><![CDATA[<p>Ich fühl mich auch nicht angegriffen, ich wollt eher indirekt dem Threadersteller sagen, das er uns konkrete Information geben soll, wenn er konkrete Antworten will <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2199239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199239</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 05 Apr 2012 21:16:07 GMT</pubDate></item></channel></rss>