<?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[Wie kann man Code Kopie durch Template ersetzen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bekomme eine List von Objekte Pointers, alle von denen von einer Basisklasse ableiten:</p>
<pre><code>std::vector&lt;Base*&gt; obj_list;

template&lt;unsigned int N&gt;
class A&lt;N&gt; : public Base
{
public:
    int do_thing_1();
};

template&lt;unsigned int N&gt;
class B&lt;N&gt; : public Base
{
public:
    int do_thing_2();
};
</code></pre>
<p>Ich muss die richtige Funktion do_thing_1() oder do_thing_2() aufrufen, je nach dem welche Subklasse sie ist.</p>
<pre><code>class MyClass
{
public:
void func(std::vector&lt;Base*&gt; &amp;obj_list)
{
  for (std::vector&lt;Base*&gt;::iterator it=obj_list.begin(); it!=obj_list.end(); ++it) {
    if (dynamic_cast&lt;A&lt;1&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;1&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;2&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;2&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;3&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;3&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;4&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;4&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;5&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;5&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;6&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;6&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;7&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;7&gt;*&gt;(*it));
    }
    ...
    else if (dynamic_cast&lt;B&lt;1&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;1&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;2&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;2&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;3&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;3&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;4&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;4&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;5&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;5&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;6&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;6&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;7&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;7&gt;*&gt;(*it));
    }
    ...
  }
}

private:

tempate&lt;unsigned int N&gt;
void operate(A&lt;N&gt; *obj)
{
  obj-&gt;do_thing_1();
}

tempate&lt;unsigned int N&gt;
void operate(B&lt;N&gt; *obj)
{
  obj-&gt;do_thing_2();
}

}; // MyClass
</code></pre>
<p>Ich muss nach allen möglichen Zahlen fragen, damit die Base Pointer richtig gecastet werden kann. Das ist fast unmöglich, 2^32 Möglichkeiten aufzulisten.</p>
<p>Gibt es bessere Methode, diesen Code intelligenter zu schreiben?</p>
<p>Die Klasse A&lt;N&gt;, B&lt;N&gt;, Base sind vorgegeben. Ich darf sie nicht ändern.</p>
<p>Ich darf auch kein boost Library verwenden.</p>
<p>Vielen Dank für den Tipps vorab.</p>
<p>Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316828/wie-kann-man-code-kopie-durch-template-ersetzen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 13:44:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316828.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 May 2013 20:56:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 20:56:59 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bekomme eine List von Objekte Pointers, alle von denen von einer Basisklasse ableiten:</p>
<pre><code>std::vector&lt;Base*&gt; obj_list;

template&lt;unsigned int N&gt;
class A&lt;N&gt; : public Base
{
public:
    int do_thing_1();
};

template&lt;unsigned int N&gt;
class B&lt;N&gt; : public Base
{
public:
    int do_thing_2();
};
</code></pre>
<p>Ich muss die richtige Funktion do_thing_1() oder do_thing_2() aufrufen, je nach dem welche Subklasse sie ist.</p>
<pre><code>class MyClass
{
public:
void func(std::vector&lt;Base*&gt; &amp;obj_list)
{
  for (std::vector&lt;Base*&gt;::iterator it=obj_list.begin(); it!=obj_list.end(); ++it) {
    if (dynamic_cast&lt;A&lt;1&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;1&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;2&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;2&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;3&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;3&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;4&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;4&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;5&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;5&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;6&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;6&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;A&lt;7&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;A&lt;7&gt;*&gt;(*it));
    }
    ...
    else if (dynamic_cast&lt;B&lt;1&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;1&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;2&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;2&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;3&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;3&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;4&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;4&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;5&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;5&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;6&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;6&gt;*&gt;(*it));
    }
    else if (dynamic_cast&lt;B&lt;7&gt;*&gt;(*it)) {
      operate(dynamic_cast&lt;B&lt;7&gt;*&gt;(*it));
    }
    ...
  }
}

private:

tempate&lt;unsigned int N&gt;
void operate(A&lt;N&gt; *obj)
{
  obj-&gt;do_thing_1();
}

tempate&lt;unsigned int N&gt;
void operate(B&lt;N&gt; *obj)
{
  obj-&gt;do_thing_2();
}

}; // MyClass
</code></pre>
<p>Ich muss nach allen möglichen Zahlen fragen, damit die Base Pointer richtig gecastet werden kann. Das ist fast unmöglich, 2^32 Möglichkeiten aufzulisten.</p>
<p>Gibt es bessere Methode, diesen Code intelligenter zu schreiben?</p>
<p>Die Klasse A&lt;N&gt;, B&lt;N&gt;, Base sind vorgegeben. Ich darf sie nicht ändern.</p>
<p>Ich darf auch kein boost Library verwenden.</p>
<p>Vielen Dank für den Tipps vorab.</p>
<p>Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324131</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 20:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:08:42 GMT]]></title><description><![CDATA[<p>Benutze einfach virtuelle Funktionen. Nichts anders versuchst du gerade nachzubauen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324134</guid><dc:creator><![CDATA[Virtual foo]]></dc:creator><pubDate>Fri, 17 May 2013 21:08:42 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:09:55 GMT]]></title><description><![CDATA[<p>Kannst du wenigstens obj_list ändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324135</guid><dc:creator><![CDATA[Dispatched foo]]></dc:creator><pubDate>Fri, 17 May 2013 21:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:13:26 GMT]]></title><description><![CDATA[<p>tjroamer schrieb:</p>
<blockquote>
<p>Gibt es bessere Methode, diesen Code intelligenter zu schreiben?</p>
</blockquote>
<p>Nein. Der Code ist nicht zu retten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324136</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 17 May 2013 21:13:26 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:12:15 GMT]]></title><description><![CDATA[<p>Virtual foo schrieb:</p>
<blockquote>
<p>Benutze einfach virtuelle Funktionen. Nichts anders versuchst du gerade nachzubauen...</p>
</blockquote>
<p>Danke. Ich verstehe nicht ganz. Wie kann ich virtuelle Funktionen dafür verwenden, um alle möglichen dynamic_cast&lt;...&gt; zu sparen?</p>
<p>Gruß,</p>
<p>Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324137</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 21:12:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:16:26 GMT]]></title><description><![CDATA[<p>Dispatched foo schrieb:</p>
<blockquote>
<p>Kannst du wenigstens obj_list ändern?</p>
</blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion</p>
<pre><code>void func(std::vector&lt;Base*&gt; &amp;obj_list);
</code></pre>
<p>anbieten, um andere sie aufrufen zu können.</p>
<p>Deshalb darf ich obj_list nicht ändern.</p>
<p>Gruß,</p>
<p>Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324138</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 21:16:26 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:19:14 GMT]]></title><description><![CDATA[<p>Virtual foo schrieb:</p>
<blockquote>
<p>Benutze einfach virtuelle Funktionen. Nichts anders versuchst du gerade nachzubauen...</p>
</blockquote>
<p>jo, die do_thing_1() und do_thing_1() virtual in die Base und alles ist gut.<br />
geht supi schnell.</p>
<p>das template geht auch, aber das tut dann nicht mehr als 2^32 ifs hintereinander. nöö, das wird nicht gut. nichtmal rtti würde viel bringen. da müßte die basis auch virtuell sein, ach ist sie ja eh schon. und das muss sie eh, wenn du die objekte in einer gemeinsamen liste verwaltest.</p>
<p>undokumentiert, undefiniert, nur für böse buben könntest du den vptr anschauen und eine hashtable benutzen. mit dem erfolg, daß du zwar ne gescheit laufzeit hast, aber nur für den potenziellen fall eines aufrufs mal die 2^32 klassen erzeugst.</p>
<p>musst die basis ändern und gegebenefalls eben den chef davon überzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324139</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 17 May 2013 21:19:14 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:29:08 GMT]]></title><description><![CDATA[<p>Solange da man nicht viel ändern kann lässt sich auch nicht viel retten.</p>
<p>Virtual foo schrieb:</p>
<blockquote>
<p>Benutze einfach virtuelle Funktionen. Nichts anders versuchst du gerade nachzubauen...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<blockquote>
<p><strong>Die Klasse A&lt;N&gt;, B&lt;N&gt;, Base sind vorgegeben. Ich darf sie nicht ändern.</strong></p>
</blockquote>
<p>Edit: Ach, Volkard redet vom Chef-Überzeugen, hab' ich übersehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324140</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 17 May 2013 21:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:25:35 GMT]]></title><description><![CDATA[<p>tjroamer schrieb:</p>
<blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion</p>
</blockquote>
<p>Bitte die vollständige Anforderung schreiben. Immer wieder einen halben Satz zu kriegen, der alles umwirft, das ist nicht fein. Wie genau sieht die Base aus?</p>
<p>So halte ich die AUfgabe für Quatsch? Übungsaufgabe vom Prof? Dann fehlt mehr Kontext, um zu ahnen, auf was er hinauswill.<br />
Aufgabe vom betrunkenen Chef? Dann wirste sie ändern können müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324142</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 17 May 2013 21:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:24:59 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion</p>
</blockquote>
<p>Bitte die vollständige Anforderung schreiben. Immer wieder einen halben Satz zu kriegen, der alles umwirft, das ist nicht fein.</p>
</blockquote>
<p>Wovon redest du?</p>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion [...] func(std::vector&lt;Base*&gt; &amp;obj_list)[...] anbieten, um andere sie aufrufen zu können.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2324143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324143</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 17 May 2013 21:24:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:27:29 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Virtual foo schrieb:</p>
<blockquote>
<p>Benutze einfach virtuelle Funktionen. Nichts anders versuchst du gerade nachzubauen...</p>
</blockquote>
<p>jo, die do_thing_1() und do_thing_1() virtual in die Base und alles ist gut.<br />
geht supi schnell.</p>
<p>das template geht auch, aber das tut dann nicht mehr als 2^32 ifs hintereinander. nöö, das wird nicht gut. nichtmal rtti würde viel bringen. da müßte die basis auch virtuell sein, ach ist sie ja eh schon. und das muss sie eh, wenn du die objekte in einer gemeinsamen liste verwaltest.</p>
<p>undokumentiert, undefiniert, nur für böse buben könntest du den vptr anschauen und eine hashtable benutzen. mit dem erfolg, daß du zwar ne gescheit laufzeit hast, aber nur für den potenziellen fall eines aufrufs mal die 2^32 klassen erzeugst.</p>
<p>musst die basis ändern und gegebenefalls eben den chef davon überzeugen.</p>
</blockquote>
<p>die Klassen A&lt;N&gt;, B&lt;N&gt; und Base kommen von einem Library. do_thing_1() und do_thing_2 sind leider keine virtuelle Funktion in Base(). Die Base Klasse hat andere Funktionalität, die hier zu meinem Zweck nicht dargestellt sind.</p>
<p>Es sieht so aus, dass ich 2^32 Mal schreiben muss, um alle möglichen Fälle abzudecken. Schade!! <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="😞"
    /> <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>Trotzdem vielen Dank.</p>
<p>/Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324144</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 21:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:31:20 GMT]]></title><description><![CDATA[<p>Vielleicht wäre was möglich, aber solange der Kontext ein großes Geheimnis ist, natürlich nicht. Das geht dann für 100€/h.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324147</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 17 May 2013 21:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:31:25 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Übungsaufgabe vom Prof? Dann fehlt mehr Kontext, um zu ahnen, auf was er hinauswill.</p>
</blockquote>
<p>Wenns von einem Prof käme könnte der vielleicht einen vptr-Hack erwarten. Standardkonform geht das jedenfalls nur mit den 2^17 ifs (weil unsigned nur von 0 bis 2^16 gehen muss).</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23579">@tjroamer</a>: Wenn du wenigstens die Signatur in <code>std::vector&lt;std::shared_ptr&lt;thing_dispatcher*&gt;&gt;</code> ändern könntest, hättest du noch eine kleine Chance (sofern du die Erstellung der Liste beeinflussen kannst).</p>
<blockquote>
<p>Es sieht so aus, dass ich 2^32 Mal schreiben muss, um alle möglichen Fälle abzudecken.</p>
</blockquote>
<p>Ach nein, da ist ein Troll am Werk. Hat sich erledigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324148</guid><dc:creator><![CDATA[BöserBube]]></dc:creator><pubDate>Fri, 17 May 2013 21:31:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:33:30 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion</p>
</blockquote>
<p>Bitte die vollständige Anforderung schreiben. Immer wieder einen halben Satz zu kriegen, der alles umwirft, das ist nicht fein.</p>
</blockquote>
<p>Wovon redest du?</p>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion [...] func(std::vector&lt;Base*&gt; &amp;obj_list)[...] anbieten, um andere sie aufrufen zu können.</p>
</blockquote>
</blockquote>
<p>Sorry, vielleicht habe ich nicht klar geschrieben. Jetzt ist die konkrete Anforderung:</p>
<p>**Meine Klasse muss den Usern die Funktion</p>
<pre><code>void func(std::vector&lt;Base*&gt; *obj_list);
</code></pre>
<p>zur Verfügung stellen. Die Funktion muss je nach der Subklasse do_thing_1() oder do_thing_2() richtig aufrufen.<br />
**</p>
<p>Gruß,</p>
<p>Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324150</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 21:33:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:35:35 GMT]]></title><description><![CDATA[<p>tjroamer schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion</p>
</blockquote>
<p>Bitte die vollständige Anforderung schreiben. Immer wieder einen halben Satz zu kriegen, der alles umwirft, das ist nicht fein.</p>
</blockquote>
<p>Wovon redest du?</p>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion [...] func(std::vector&lt;Base*&gt; &amp;obj_list)[...] anbieten, um andere sie aufrufen zu können.</p>
</blockquote>
</blockquote>
<p>Sorry, vielleicht habe ich nicht klar geschrieben. Jetzt ist die konkrete Anforderung:</p>
<p>**Meine Klasse muss den Usern die Funktion</p>
<pre><code>void func(std::vector&lt;Base*&gt; *obj_list);
</code></pre>
<p>zur Verfügung stellen. Die Funktion muss je nach der Subklasse do_thing_1() oder do_thing_2() richtig aufrufen.<br />
**</p>
<p>Gruß,</p>
<p>Kai</p>
</blockquote>
<p>Süßer, wir haben den Code von Base immer noch nicht. Sind wenigstens do_thing_1 und do_thing_2 dort virtuell? Dann würde doch RTTI reichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324151</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 17 May 2013 21:35:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:39:43 GMT]]></title><description><![CDATA[<p>BöserBube schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Übungsaufgabe vom Prof? Dann fehlt mehr Kontext, um zu ahnen, auf was er hinauswill.</p>
</blockquote>
<p>Wenns von einem Prof käme könnte der vielleicht einen vptr-Hack erwarten. Standardkonform geht das jedenfalls nur mit den 2^17 ifs (weil unsigned nur von 0 bis 2^16 gehen muss).</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23579">@tjroamer</a>: Wenn du wenigstens die Signatur in <code>std::vector&lt;std::shared_ptr&lt;thing_dispatcher*&gt;&gt;</code> ändern könntest, hättest du noch eine kleine Chance (sofern du die Erstellung der Liste beeinflussen kannst).</p>
<blockquote>
<p>Es sieht so aus, dass ich 2^32 Mal schreiben muss, um alle möglichen Fälle abzudecken.</p>
</blockquote>
<p>Ach nein, da ist ein Troll am Werk. Hat sich erledigt.</p>
</blockquote>
<p>ich denke, ich muss aufgeben, der Parameter std::vector&lt;Base*&gt; ist leider nicht änderbar. Vielen Dank an euch allen für eure Zeit und gute Nacht!</p>
<p>Gruß,</p>
<p>Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324152</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 21:39:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:50:13 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion</p>
</blockquote>
<p>Bitte die vollständige Anforderung schreiben. Immer wieder einen halben Satz zu kriegen, der alles umwirft, das ist nicht fein.</p>
</blockquote>
<p>Wovon redest du?</p>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Die Anforderung ist: meine Klasse muss die public Funktion [...] func(std::vector&lt;Base*&gt; &amp;obj_list)[...] anbieten, um andere sie aufrufen zu können.</p>
</blockquote>
</blockquote>
<p>Sorry, vielleicht habe ich nicht klar geschrieben. Jetzt ist die konkrete Anforderung:</p>
<p>**Meine Klasse muss den Usern die Funktion</p>
<pre><code>void func(std::vector&lt;Base*&gt; *obj_list);
</code></pre>
<p>zur Verfügung stellen. Die Funktion muss je nach der Subklasse do_thing_1() oder do_thing_2() richtig aufrufen.<br />
**</p>
<p>Gruß,</p>
<p>Kai</p>
</blockquote>
<p>Süßer, wir haben den Code von Base immer noch nicht. Sind wenigstens do_thing_1 und do_thing_2 dort virtuell? Dann würde doch RTTI reichen.</p>
</blockquote>
<p>die Klasse Base und A&lt;N&gt;, B&lt;N&gt; sehen so aus:</p>
<pre><code>class Base
{
public:
  Base() {}
  virtual const char* kind();
  virtual const char* name();
  virtual ~Base();
};

template&lt;unsigned int N&gt;
class A: public Base
{
public:
  A() {}
  void do_thing_1()
  {
    // do thing_1 depending on the N
  }

  virtual const char* kind() { return &quot;A&quot;; }
  virtual const char* name() { return &quot;A&quot;; }
};

template&lt;unsigned int N&gt;
class B: public Base
{
public:
  B() {}
  void do_thing_2()
  {
    // do thing_2 depending on the N
  }

  virtual const char* kind() { return &quot;B&quot;; }
  virtual const char* name() { return &quot;B&quot;; }
};
</code></pre>
<p>do_thing_1() und do_thing_2() sind keine virtual <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="😞"
    /> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2324153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324153</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 21:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:49:52 GMT]]></title><description><![CDATA[<p>Aber Hase! Da sind ja weder do_thing_1 oder ~_2 in der Basisklasse deklariert, geschweige denn virtuell!</p>
<p>Übrigens, die sind so klein? In dem Fall sei doch ein ganz Böser Bezlebub' und schreib die zwei Zeilen da rein - ich nehme die Verantwortung auf mich:</p>
<pre><code>virtual void do_thing_1() = 0;
virtual void do_thing_2() = 0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2324154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324154</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 17 May 2013 21:49:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:52:00 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Aber Hase! Da sind ja weder do_thing_1 oder ~_2 in der Basisklasse deklariert, geschweige denn virtuell!</p>
<p>Übrigens, die sind so klein? In dem Fall sei doch ein ganz Böser Bezlebub' und schreib die zwei Zeilen da rein - ich nehme die Verantwortung auf mich:</p>
<pre><code>virtual void do_thing_1() = 0;
virtual void do_thing_2() = 0;
</code></pre>
</blockquote>
<p>anscheinend gibt es keinen anderen Weg. OK, ich versuche auf diesen Weg zu gehen. Vielen Dank.</p>
<p>Gruß,</p>
<p>Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324155</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 21:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:52:49 GMT]]></title><description><![CDATA[<p>tjroamer schrieb:</p>
<blockquote>
<p>Das ist fast unmöglich, 2^32 Möglichkeiten aufzulisten.</p>
</blockquote>
<p>Das ist nicht dein Problem. Dein Problem ist, dass du 2^32+ verschiedene Funktionen hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324156</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 17 May 2013 21:52:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 21:59:19 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Das ist fast unmöglich, 2^32 Möglichkeiten aufzulisten.</p>
</blockquote>
<p>Das ist nicht dein Problem. Dein Problem ist, dass du 2^32+ verschiedene Funktionen hast.</p>
</blockquote>
<p>Fast ein wenig ironisch - Stroustrup schreibt noch, Templates sind gut, um den Maschinencode zu verkürzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Edit: Oder so ähnlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324157</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 17 May 2013 21:59:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 22:03:23 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>tjroamer schrieb:</p>
<blockquote>
<p>Das ist fast unmöglich, 2^32 Möglichkeiten aufzulisten.</p>
</blockquote>
<p>Das ist nicht dein Problem. Dein Problem ist, dass du 2^32+ verschiedene Funktionen hast.</p>
</blockquote>
<p>die Funktion operate() ist als template definiert. Hier ist kein Problem. Der User kann folgenden Code schreiben:</p>
<pre><code>A&lt;13&gt; a_13();
B&lt;1000&gt; b_1000();

std::vector&lt;Base*&gt; obj_list;
obj_list.push_back(&amp;a_13);
obj_list.push_back(&amp;b_1000);

MyClass myclass();

myclass.func(obj_list);
</code></pre>
<p>MyClass muss solchen Code beherrschen. Das ist mein Problem.</p>
<p>Gruß,</p>
<p>/Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324158</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 22:03:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 22:07:33 GMT]]></title><description><![CDATA[<pre><code>A&lt;13&gt; a_13();//er wird
B&lt;1000&gt; b_1000();//sich wundern

std::vector&lt;Base*&gt; obj_list;
obj_list.push_back(&amp;a_13);//hier
obj_list.push_back(&amp;b_1000);

MyClass myclass();

myclass.func(obj_list);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2324161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324161</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 17 May 2013 22:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 22:09:49 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code>A&lt;13&gt; a_13();//er wird
B&lt;1000&gt; b_1000();//sich wundern

std::vector&lt;Base*&gt; obj_list;
obj_list.push_back(&amp;a_13);//hier
obj_list.push_back(&amp;b_1000);

MyClass myclass();

myclass.func(obj_list);
</code></pre>
</blockquote>
<p>gibt es hier einen Tippfehler oder wie?</p>
<p>Gruß,</p>
<p>Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324162</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 22:09:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 22:10:57 GMT]]></title><description><![CDATA[<p>Ich sehe es sofort. :stolz: <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>Edit:</p>
<p>tjroamer schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<pre><code>A&lt;13&gt; a_13();//er wird
B&lt;1000&gt; b_1000();//sich wundern

std::vector&lt;Base*&gt; obj_list;
obj_list.push_back(&amp;a_13);//hier
obj_list.push_back(&amp;b_1000);

MyClass myclass();

myclass.func(obj_list);
</code></pre>
</blockquote>
<p>gibt es hier einen Tippfehler oder wie?</p>
</blockquote>
<p>Das sind Funktionsdeklarationen.<br />
Guckstdu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324163</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 17 May 2013 22:10:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man Code Kopie durch Template ersetzen? on Fri, 17 May 2013 22:14:35 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ich sehe es sofort. :stolz: <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>Edit:</p>
<p>tjroamer schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<pre><code>A&lt;13&gt; a_13();//er wird
B&lt;1000&gt; b_1000();//sich wundern

std::vector&lt;Base*&gt; obj_list;
obj_list.push_back(&amp;a_13);//hier
obj_list.push_back(&amp;b_1000);

MyClass myclass();

myclass.func(obj_list);
</code></pre>
</blockquote>
<p>gibt es hier einen Tippfehler oder wie?</p>
</blockquote>
<p>Das sind Funktionsdeklarationen.<br />
Guckstdu.</p>
</blockquote>
<p>OK. Wahrscheinlich habe ich zu einfach geschrieben. Ich wollte schreiben, a_13 und b_1000 sind zwei Klassenobjekten.</p>
<p>sollte sein:</p>
<pre><code>A&lt;13&gt; a_13;
B&lt;1000&gt; b_1000;
</code></pre>
<p>Gruß,</p>
<p>/Kai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324164</guid><dc:creator><![CDATA[tjroamer]]></dc:creator><pubDate>Fri, 17 May 2013 22:14:35 GMT</pubDate></item></channel></rss>