<?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 function templates]]></title><description><![CDATA[<p>Guten Morgen.</p>
<p>Ich habe eine Klasse, die in etwa so aussieht:</p>
<pre><code class="language-cpp">struct A
{
  virtual void foo(std::list&lt;std::unique_ptr&lt;A&gt;&gt;&amp; as)
  {}
};
</code></pre>
<p>Ich möchte einem Aufrufer aber eigentlich weder eine list, noch einen unique_ptr aufzwingen. Ein Template (Iteratoren) würde diese Anforderungen erfüllen. (Ich finds zwar doof, weil man dann irgendwie alles übergeben kann, aber na ja.)<br />
Wie auch immer, Templates können logischerweise nicht virtual sein. Jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298660/virtual-function-templates</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 18:47:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298660.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jan 2012 11:30:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 11:30:46 GMT]]></title><description><![CDATA[<p>Guten Morgen.</p>
<p>Ich habe eine Klasse, die in etwa so aussieht:</p>
<pre><code class="language-cpp">struct A
{
  virtual void foo(std::list&lt;std::unique_ptr&lt;A&gt;&gt;&amp; as)
  {}
};
</code></pre>
<p>Ich möchte einem Aufrufer aber eigentlich weder eine list, noch einen unique_ptr aufzwingen. Ein Template (Iteratoren) würde diese Anforderungen erfüllen. (Ich finds zwar doof, weil man dann irgendwie alles übergeben kann, aber na ja.)<br />
Wie auch immer, Templates können logischerweise nicht virtual sein. Jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172229</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 25 Jan 2012 11:30:46 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 11:49:46 GMT]]></title><description><![CDATA[<p>Erklär mal genauer was A und foo eigentlich sind und wieso foo virtual sein muss.<br />
Ansonsten bleibt dir wohl nur sowas wie ein IEnumerable Interface zu bauen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172240</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 25 Jan 2012 11:49:46 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 12:00:29 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Ansonsten bleibt dir wohl nur sowas wie ein IEnumerable Interface zu bauen...</p>
</blockquote>
<p>IEnumerable klingt eher nach C# <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="😉"
    /> Aber sowas wie eine Iterator-Range oder einfach eine abstrakte Iteratorklasse ginge zum Beispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172246</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 25 Jan 2012 12:00:29 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 12:08:35 GMT]]></title><description><![CDATA[<p>Na das ist doch genau was ich gemeint hab <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/2172252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172252</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 25 Jan 2012 12:08:35 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 12:12:27 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Na das ist doch genau was ich gemeint hab <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>Sry, mein Fehler - mir war klar, dass du das gemeitn hast. Nur war meine Befürchtung, dass IEnumerable dem OP nicht so viel sagt, weil es eben häufiger im C#-Kontext vorkommt als im C++-Kontext, und dass man dem Kind deshalb vielleicht einen anderen Namen geben sollte - einen der in C++ eher zuhause ist <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/2172256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172256</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 25 Jan 2012 12:12:27 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 12:17:36 GMT]]></title><description><![CDATA[<p>Achso. Ja, sowas wäre natürlich eine Lösung. Die Frage ist, ob man das Problem nicht überhaupt mit einem ganz anderen Design besser lösen kann. Denn ein virtual Function call in jeder Iteration ist unter Umständen nicht unbedingt wünschenswert. Aber dazu müsste man das konkrete Problem besser kennen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172259</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 25 Jan 2012 12:17:36 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 12:30:44 GMT]]></title><description><![CDATA[<p>Das schreit nach Type-Erasure / Polymorphie / Callbacks.</p>
<p>Vielleicht so:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class abstract_range
{
protected:
  abstract_range() {}
  ~abstract_range() {}
public:
  typedef typename std::remove_cv&lt;T&gt;::type value_type;
  typedef T&amp; reference;

  virtual bool empty() const = 0;
  virtual reference front() const = 0;
  virtual void pop_front() = 0;
};

void print(abstract_range&lt;const A&gt; &amp;&amp; rng)
{
  while (!rng.empty()) {
    cout &lt;&lt; rng.front();
    rng.pop_front();
  }
}

class dings : public abstract_range&lt;const A&gt;
{
  …
};

int main() {
  vector&lt;unique_ptr&lt;A&gt;&gt; bums;
  …
  print(dings(bums));
}
</code></pre>
<p>Das, was ich hier &quot;dings&quot; genannt habe, könnte man auch noch als viel generischeren Iterator-Wrapper aufboren, der mit einem Optionalen Funktionsobjekt auch noch die Dereferenzierung eines Zeigers erlaubt:</p>
<pre><code class="language-cpp">template&lt; … &gt;
class … : public abstract_range&lt; … &gt;
{
  …
  bool empty() const {
    return this-&gt;begin_iter == this-&gt;end_iter;
  }

  reference front() const {
    return this-&gt;funcobj(this-&gt;begin_iter);
  }

  void pop_front() {
    ++(this-&gt;begin_iter);
  }
  …
};
</code></pre>
<p>Die Sache mit der Laufzeitpolimorphie ist wie eine Pest. Hat man damit im Design einmal mit angefangen, wird man sie nicht so schnell wieder los. Ggf brauchst du gar keine virtuelle Methode namens foo. Falls doch, kann man sich eventuell eine bessere Schnittstelle überlegen, die nicht für jedes Element eine virtuelle Funktion aufrufen muss, sondern Daten vielleicht in größere Häppchen liefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172262</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 25 Jan 2012 12:30:44 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 12:42:02 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Erklär mal genauer was A und foo eigentlich sind und wieso foo virtual sein muss.</p>
</blockquote>
<p>Offen gesagt hatte ich das Problem schon öfter, wobei foo nicht immer virtual sein musste, weshalb ich teilweise auf Templates ausweichen konnte. Schön fand ich das aber noch nie, wenn der Typ von *iterator schon feststeht.</p>
<p>Beispiele wären z.B. ein Server der auf Clienten arbeiten soll (&quot;handleClients(..)&quot;) (nicht virtual), oder ein Spielobjekt, das eine &quot;tick()&quot; Funktion hat. (virtual)</p>
<p>So etwas wäre schön:</p>
<pre><code class="language-cpp">void foo(Iterator&lt;A*&gt; begin, Iterator&lt;A*&gt; end)
{ // &quot;Gib mir Zeiger, deren arithmetisches Verhalten egal ist, die aber auf einen A* zeigen.&quot;
}
</code></pre>
<p>Der unique_ptr würde natürlich bleiben. Aber damit könnte ich noch leben denke ich.<br />
Nur stehe ich gerade etwas auf dem Schlauch. Irgendwie schaffe ich es nicht mal, den Typ des Iterators in einer Klasse zu verstecken.</p>
<p>Wenn man mal bei dem Spielobjekt mit dem tick() bleibt, sollte ein weiterer virtueller Aufruf durch den Iterator natürlich vermieden werden.<br />
(Edit: Wobei. Kommt darauf an. Wann hat man schon mal &gt; 10k Objekte im Spiel? Da sind vielleicht sogar virtuelle Iteratoren gar nicht so schlimm..)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172265</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 25 Jan 2012 12:42:02 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 12:54:33 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>So etwas wäre schön:</p>
<pre><code class="language-cpp">void foo(Iterator&lt;A*&gt; begin, Iterator&lt;A*&gt; end)
</code></pre>
</blockquote>
<p>Nein, wärs nicht. Dafür gibt es<a href="http://www.boost.org/libs/iterator/doc/indirect_iterator.html" rel="nofollow"> <code>boost::indirect_operator</code> </a>, dann kannst du bei <code>Iterator&lt;A&gt;</code> bleiben.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Beispiele wären z.B. ein Server der auf Clienten arbeiten soll (&quot;handleClients(..)&quot;) (nicht virtual), oder ein Spielobjekt, das eine &quot;tick()&quot; Funktion hat. (virtual)</p>
</blockquote>
<p>Versteh ich nicht.<br />
Meistens kannst du ein handleClients (nicht virtual) machen, das ein handleSingleClient (virtual) aufruft. Also das du das Iterieren in ein Non-Virtual Interface verschiebst.</p>
<p>Jedenfalls ging das bei mir und ich hatte einen abstract_range nie nötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172272</guid><dc:creator><![CDATA[indreckt]]></dc:creator><pubDate>Wed, 25 Jan 2012 12:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 12:56:24 GMT]]></title><description><![CDATA[<p>indreckt schrieb:</p>
<blockquote>
<p>Jedenfalls ging das bei mir und ich hatte einen abstract_range nie nötig.</p>
</blockquote>
<p>Das wird aber schwer, wenn ein Clienten interagieren sollen. <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/2172274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172274</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 25 Jan 2012 12:56:24 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 12:57:08 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>… jetzt sehe ich auch noch krümelkackers Beitrag. (Das … kommt wohl in Mode…)<br />
Von welchem Typ sind denn bei dir begin_iter und end_iter?</p>
</blockquote>
<pre><code class="language-cpp">template &lt;class Iter&gt;
struct IterRange : abstract_range&lt;typename std::iterator_traits&lt;Iter&gt;::value_type&gt;
{
  Iter begin_iter;
  Iter end_iter;

  IterRange(Iter first, Iter last);
  …
};

template &lt;class Iter&gt;
IterRange&lt;Iter&gt; make_range(Iter first, Iter last)
{ return IterRange(first, last); }

template &lt;class Container&gt;
IterRange&lt;typename Container::iterator&gt; make_range(Container&amp; cont)
{ return IterRange(cont.begin(), cont.end()); }

template &lt;class Container&gt;
IterRange&lt;typename Container::const_iterator&gt; make_range(Container const&amp; cont)
{ return IterRange(cont.begin(), cont.end()); }

//usw...
</code></pre>
<p>Anderer Ansatz, um das virtual in der Klasse zu lassen und nicht irgendwelche Iteratoren abstrahieren zu müssen: Template Method Pattern.</p>
<p>Allgemeine, aufgebohrte Overkill-Version:</p>
<pre><code class="language-cpp">struct A
{
  template &lt;class Iter&gt;
  void foo(Iter first, Iter last)
  {
    static_assert(std::is_same&lt;A, typename std::iterator_traits&lt;Iter&gt;::value_type&gt;::value, &quot;foo nur mit Iteratoren auf A aufrufen!&quot;)

    begin_foo();
    if (first != last)
      do_foo(*first++);
    for(; first != last; ++first)
    {
      between_foo();
      do_foo(*first);
    }
    end_foo();
  }

  virtual void begin_foo();
  virtual void do_foo(A&amp;);
  virtual void between_foo();
  virtual void end_foo();
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2172275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172275</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 25 Jan 2012 12:57:08 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 14:38:01 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>So etwas wäre schön:</p>
<pre><code class="language-cpp">void foo(Iterator&lt;A*&gt; begin, Iterator&lt;A*&gt; end)
{ // &quot;Gib mir Zeiger, deren arithmetisches Verhalten egal ist, die aber auf einen A* zeigen.&quot;
}
</code></pre>
</blockquote>
<p>Bekommst Du:<br />
vector&lt;unique_ptr&lt;A&gt;&gt;::iterator --&gt; boost::indirect_iterator&lt;…&gt; --&gt; <a href="http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html" rel="nofollow">any_iterator&lt;A&gt;</a></p>
<p>wobei der any_iterator ähnlich wie boost/std::function auf den Freispeicher ausweicht, was eigentlich nur dann nötig ist, wenn man diese Iteratoren per Wert übergeben will und wenn sie kopierbar sein müssen. Das habe ich mir bei abstract_range vorhin extra gespart. Auch blöd bei diesem any_iterator-Ansatz ist, dass man sie vergleichen können sollte. In der entsprechenden operator== und operator!= Funktion wird erstmal geprüft, ob die versteckten Typen überhaupt zusammen passen. Das ist eben der Haken daran, wenn man zwei Objekte braucht, um eine Sequenz darzustellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172316</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 25 Jan 2012 14:38:01 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 15:19:39 GMT]]></title><description><![CDATA[<p>Wenn du einfach nur die tick() Methode all deiner Spielobjekte aufrufen willst, dann mach das doch einfach? Wieso musst du da irgendwo eine abstrakte Collection dieser Objekte an eine virtuelle Methode übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172336</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 25 Jan 2012 15:19:39 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 15:39:00 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>krümelkackers Code Erklärung</p>
</blockquote>
<p>Ja, das habe ich dann auch gemerkt. ^^</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Anderer Ansatz, um das virtual in der Klasse zu lassen und nicht irgendwelche Iteratoren abstrahieren zu müssen: Template Method Pattern.</p>
</blockquote>
<p>Das Problem ist halt, dass die Objekte / Clienten untereinander agieren müssen, soweit ich das hier sehe funktioniert das so leider nicht.</p>
<p>Hm.. ich glaube ich schreibe erst mal eine std::list&lt;std::unique_ptr&lt;A&gt;&gt;::iterator Version, und teste irgendwann später die Version mit den virtuellen Iteratoren. Dann habe ich auch gleich einen direkten Geschwindigkeitsvergleich.</p>
<p>any_iterator habe ich auch schon gefunden, aber das ganze scheint mir etwas langsam. Eigentlich ähnlich der Lösung von krümelkacker?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6496">@dot</a><br />
Wie sollen sich denn Objekte in einer Welt zurechtfinden, in der sie nicht mit den anderen Objekten kommunizieren können? Angenommen bei einem Strategiespiel hat man eine Einheit, die feindliche Objekte im Radius von 5 Metern automatisch angreift. Wie soll diese Einheit denn nach feindlichen Objekten suchen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172355</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 25 Jan 2012 15:39:00 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 15:47:56 GMT]]></title><description><![CDATA[<p>Objekte werden normalerweise in einer Welt verwaltet. Eine Einheit fragt einfach die Welt &quot;gib mir alle Objekte im Bereich ...&quot;. Danach kann ich entscheiden, welches Objekt angegriffen wird. Wenn man will kann man das gern in Sensoren, Aktuatoren, Trigger, etc. aufteilen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172361</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 25 Jan 2012 15:47:56 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 15:48:43 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Angenommen bei einem Strategiespiel hat man eine Einheit, die feindliche Objekte im Radius von 5 Metern automatisch angreift. Wie soll diese Einheit denn nach feindlichen Objekten suchen?</p>
</blockquote>
<p>Gar nicht. Wieso sollte die Einheit sämtliche Objekte der Spielwelt kennen und diese dann auch noch durchsuchen? Die Einheit kann niemals genug Information haben um das auch nur annähernd effizient durchzuführen.<br />
Aber irgendjemand kennt alle Objekte und hat die evtl. auch schon in einer Datenstruktur organisiert, mit der solche Abfragen effizient durchgeüfhrt werden können. Die bessere Lösung wäre also, dass deine Einheit einfach diesen jemand nach den 5 nähesten gengerischen Einheiten fragt <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/2172362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172362</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 25 Jan 2012 15:48:43 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 15:48:50 GMT]]></title><description><![CDATA[<p>Gib mal eine grobe Beschreibung deiner Gegebenheiten ab, aber etwas weniger abstrakt als A::foo <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>Ich vermute jetzt mal, dass du folgendes hast:</p>
<p>a) Einen Haufen Spielobjekte<br />
b) Einen oder mehrere Container, die diese Spieolbjekte beinhalten</p>
<p>A::foo() ist dann eine Methode dieser Spieolbjekte, mit der du WAS machen möchtest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172363</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 25 Jan 2012 15:48:50 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 16:50:38 GMT]]></title><description><![CDATA[<p>Da das mit den Iteratoren ja mehr oder weniger durchgekaut ist, können wir ja auch gleich mit Spieledesign weitermachen. <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="🤡"
    /></p>
<p>Der Plan war eigentlich, quasi das gesamte Geschehen Objektintern zu regeln. Soll heißen, im Mainloop gibt es irgendwo so etwas:</p>
<pre><code class="language-cpp">auto elpased_time = timer.tick();
for (auto i = begin(objects); i != end(objects); ++i)
  (*i)-&gt;tick(elapsed_time, begin(objects), end(objects));
</code></pre>
<p>So weit, so gut. Alle Objekte können jetzt in tick() machen was sie wollen. Das Grundgerüst schien mir eigentlich relativ angenehm.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6496">@dot</a>:<br />
Das bedeutet, du würdest also für jede Objektinteraktion irgendeine Klasse einbauen, die das ganze regelt? Ich habe irgendwie noch nicht ganz verstanden wie sich ein Objekt zurechtfinden soll, ohne die anderen Objekte zu kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172395</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 25 Jan 2012 16:50:38 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 16:55:30 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6496">@dot</a>:<br />
Das bedeutet, du würdest also für jede Objektinteraktion irgendeine Klasse einbauen, die das ganze regelt? Ich habe irgendwie noch nicht ganz verstanden wie sich ein Objekt zurechtfinden soll, ohne die anderen Objekte zu kennen.</p>
</blockquote>
<p>Dein Objekt braucht die anderen Objekte nicht kennen. Dein Objekt braucht nur ein Objekt zu kennen, welches ihm sagen kann welche Objekte sich im Umkreis von 5m befinden oder so...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172399</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 25 Jan 2012 16:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Wed, 25 Jan 2012 17:32:25 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Alle Objekte können jetzt in tick() machen was sie wollen.</p>
</blockquote>
<p>Richtig. allerdings MÜSSEN sie so auch alles selbst machen. Denk ans &quot;Single Responsibility Principle&quot;. Deine &quot;Panzer&quot; sind dafür zuständig, die anderen abzuschießen. Dazu schauen sie in ihre &quot;Umgebung&quot;, wer da ist, und rechnen nicht für alle Objekte der großen weiten Welt mit Zettel und Stift selber aus, wer denn da alles nicht ist.<br />
Die &quot;Umgebung&quot; sollte ein eigenes Objekt sein, das auf solche Distanzberechnungen spezialisiert ist - schließlich werden nicht nur die Panzer sondern auch andere solche Berechnungen benötigen <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>
<pre><code class="language-cpp">Range operator&quot;&quot; _m(char const* meters); //yes, we can in C++11!

void Panzer::tick()
{
  auto inRange = map.getObjectsInRadius(*this, 5_m);
  for (auto targetIter = inRange.begin(); targetIter != inRange.end() &amp;&amp; shotsRemain(); ++targetIter)
  {
    if (isEnemy(*targetIter))
    {
      shootAt(*targetIter);
    }
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2172421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172421</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 25 Jan 2012 17:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Thu, 26 Jan 2012 00:55:56 GMT]]></title><description><![CDATA[<p>Leute, packt mal die Kanonen wieder ein, ihr verschreckt die Spatzen.</p>
<pre><code class="language-cpp">struct A 
 { 
   virtual void foo(std::list&lt;std::unique_ptr&lt;A&gt;&gt;&amp; as) 
   {} 
 };
</code></pre>
<p>Einfache und oft anwendbare Lösung:</p>
<pre><code class="language-cpp">struct A 
{ 
   template &lt;class T&gt;
   void foo(T const&amp; as)
   {
       // ... Vorbereitung ...

       BOOST_FOREACH(typename T::reference a, as) // ich hoffe das typename T::reference passt, aber wenn nicht so, dann so ähnlich :D
           do_one_foo(*get(a));

       // ... Nacharbeiten ...
   }

private:
   virtual void do_one_foo(A&amp; a) 
   {} 
};
</code></pre>
<p>Tadaaaaa. Und ganz ohne Type-Erasure oder 100 Hilfsklassen <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/2172677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172677</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 26 Jan 2012 00:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Thu, 26 Jan 2012 09:10:47 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Range operator&quot;&quot; _m(char const* meters); //yes, we can in C++11!
</code></pre>
</blockquote>
<p>Warum <code>char*</code> und nicht <code>long double</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172724</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 26 Jan 2012 09:10:47 GMT</pubDate></item><item><title><![CDATA[Reply to virtual function templates on Thu, 26 Jan 2012 09:45:06 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Warum <code>char*</code> und nicht <code>long double</code> ?</p>
</blockquote>
<p>Touché, natürlich <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/2172746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172746</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 26 Jan 2012 09:45:06 GMT</pubDate></item></channel></rss>