<?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[virtuelle Templates]]></title><description><![CDATA[<p>Hallo!</p>
<p>Warum sind eigentlich virtuelle Templates verboten? Konket habe ich folgende Basisklasse:</p>
<pre><code class="language-cpp">class command 
{
public:
  template&lt;typename... T&gt;
  virtual void operator()(const T&amp;... parameter) = 0;
};
</code></pre>
<p>Gibt es einen Weg, wie man das trotzdem einsetzen kann?</p>
<p>Niels.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245755/virtuelle-templates</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 13:08:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245755.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Jul 2009 11:39:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 11:41:56 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Warum sind eigentlich virtuelle Templates verboten? Konket habe ich folgende Basisklasse:</p>
<pre><code class="language-cpp">class command 
{
public:
  template&lt;typename... T&gt;
  virtual void operator()(const T&amp;... parameter) = 0;
};
</code></pre>
<p>Gibt es einen Weg, wie man das trotzdem einsetzen kann?</p>
<p>Niels.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745238</guid><dc:creator><![CDATA[nielsp]]></dc:creator><pubDate>Sat, 18 Jul 2009 11:41:56 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 11:51:09 GMT]]></title><description><![CDATA[<p>Mach aus der Klasse ein template.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745249</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 18 Jul 2009 11:51:09 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 11:56:59 GMT]]></title><description><![CDATA[<p>So?</p>
<pre><code class="language-cpp">template&lt;typename... T&gt;
class command 
{
public:
  virtual operator()(const T&amp;... parameter) = 0;
};
</code></pre>
<p>Ich denke nicht, dass ich das machen kann, denn irgendwo habe ich stehen:</p>
<pre><code class="language-cpp">std::map&lt;std::string, std::shared_ptr&lt;command&gt;&gt; some_commands;
</code></pre>
<p>aber wenn <code>command</code> jetzt eine Template ist, dann geht das ja nicht mehr.</p>
<p>Niels.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745251</guid><dc:creator><![CDATA[nielsp]]></dc:creator><pubDate>Sat, 18 Jul 2009 11:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 12:00:16 GMT]]></title><description><![CDATA[<p>nielsp schrieb:</p>
<blockquote>
<p>Warum sind eigentlich virtuelle Templates verboten? Konket habe ich folgende Basisklasse:</p>
<pre><code class="language-cpp">class command 
{
public:
  template&lt;typename... T&gt;
  virtual void operator()(const T&amp;... parameter) = 0;
};
</code></pre>
</blockquote>
<p>Sei</p>
<pre><code class="language-cpp">command* pc = some_function();
(*pc)(24,23,99);
</code></pre>
<p>Was soll der Compiler hier machen? (rhetorische Frage) Überlege Dir auch, wie er das anstellen sollte. Beachte: Der Zeiger pc wird zur <em>Laufzeit</em> gesetzt und kann auf ein Objekt einer beliebigen abgeleiteten Klasse zeigen. Woher soll der Compiler wissen, welches Funktionstemplate zur <em>Compile-Zeit</em> instanziiert werden muss?</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745257</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sat, 18 Jul 2009 12:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 12:03:37 GMT]]></title><description><![CDATA[<p>nielsp schrieb:</p>
<blockquote>
<p>Hallo!</p>
<p>Warum sind eigentlich virtuelle Templates verboten?</p>
</blockquote>
<p>Weil das dynamisches Dispatching (Namensauflösung und Bindung der Methode während der Laufzeit) erfordert, was C++ nicht kennt. C++ kennt nur statisches Dispatching, dabei wird der Namen bereits zum Compilezeitpunkt aufgelöst und meist in eine vtable übersetzt. Das ist schneller aber nicht so flexibel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745259</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sat, 18 Jul 2009 12:03:37 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 12:11:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct base_command
{
//...
};

template&lt;typename... T&gt;
class command : base
{
public:
  virtual operator()(const T&amp;... parameter) = 0;
}; 	

std::map&lt;std::string, std::shared_ptr&lt;base_command&gt;&gt; some_commands;
</code></pre>
<p>Ich bin mir nicht 100% sicher, ob du so das hinkriegst, was du willst, aber probiers mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745262</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 18 Jul 2009 12:11:22 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 12:11:38 GMT]]></title><description><![CDATA[<p>nielsp schrieb:</p>
<blockquote>
<p>Warum sind eigentlich virtuelle Templates verboten?</p>
</blockquote>
<p>Darauf kommst du von selbst, wenn du mal darüber nachdenkst, wie man virtuelle Methoden implementieren könnte. Die kanonische Lösung ist eine VMT. Für</p>
<pre><code class="language-cpp">struct Foo
{
    int i, j;
    virtual void bar (void) {}
    virtual void baz (void) {}
};
</code></pre>
<p>generiert ein Compiler ein Objektlayout wie das folgende:</p>
<pre><code>Objekt         VMT
======         ===

               | ...   |
               | RTTI  |
+---------+    +-------+
| pVMT    | -&gt; | &amp;bar  |
+---------+    | &amp;baz  |
| i       |    +-------+
| j       |
+---------+
</code></pre>
<p>(Btw, könnte man nicht mal ASCII-Art-Tags einführen?)</p>
<p>Die VMT existiert für jede Klasse genau einmal und referenziert alle virtuellen Methoden; sie werden also alle mit ins Binary hineingelinkt - denn man weiß zu diesem Zeitpunkt ja nicht, welche virtuellen Funktionen einmal aufgerufen werden könnten.</p>
<p>Nun stelle dir vor, bar wäre ein Funktionstemplate. Als Funktion gibt es bar genau einmal, also belegt es einen Slot in der VMT. Als Template jedoch können unendlich viele unterschiedliche Instantiierungen existieren. Es bleiben also zwei Optionen:<br />
- Der Compiler generiert für jede mögliche Instantiierung Code und referenziert ihn in der VMT.<br />
- Wenn ein virtuelles Funktionstemplate aufgerufen wird, schlägt das Programm in einer Tabelle aller vorliegenden Instantiierungen nach; sofern die Instantiierung noch nicht existiert, wird sie generiert.</p>
<p>Die Folgen beider Ansätze dürften sichtbar sein: #1 erfordert unendlich große VMTs, unendlich lange Übersetzungszeiten etc. #2 erfordert Codegeneration zur Laufzeit - und nicht nur das: C++-Templates verwenden Duck-Typing-Mechanismen zur Übersetzungszeit, also muß ein Programm, das virtuelle Funktionstemplates benutzt, einen C++-Compiler enthalten - und eine Instantiierung könnte sogar zur Laufzeit scheitern!</p>
<p>(So weit ich weiß, werden Generics in .NET vom JIT-Compiler nach Bedarf instantiiert. #2 dürfte also mit Generics und JIT sogar umsetzbar sein.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745265</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 18 Jul 2009 12:11:38 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 14:26:03 GMT]]></title><description><![CDATA[<p>Danke für die Antworten!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>: Findet Template-Auflösung nicht zur Compilezeit statt? Also wenn der Compiler im Code sieht, dass eine Instanzierung mit T=bla erfolgt, die entsprechende Variante erzeugt und das erzeugte Produkt dann zum Compilieren weiterverwendet wird?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: Wie greife ich dann auf ein bestimmtes <code>command</code> -Objekt zu? So?</p>
<pre><code class="language-cpp">static_cast&lt;command&lt;T...&gt;&gt;(some_commands[some_index].get())(param1, param2, ...);
</code></pre>
<p>Niels.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745333</guid><dc:creator><![CDATA[nielsp]]></dc:creator><pubDate>Sat, 18 Jul 2009 14:26:03 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 15:04:57 GMT]]></title><description><![CDATA[<p>nielsp schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>: Findet Template-Auflösung nicht zur Compilezeit statt? Also wenn der Compiler im Code sieht, dass eine Instanzierung mit T=bla erfolgt, die entsprechende Variante erzeugt und das erzeugte Produkt dann zum Compilieren weiterverwendet wird?</p>
</blockquote>
<p>Sicher - aber wie soll das bei virtuellen Funktionen gehen? Nimm folgendes Beispiel:</p>
<p>common.hpp:</p>
<pre><code class="language-cpp">struct IFoo
{
    template &lt;typename T&gt;
        virtual void bar (void) = 0;
};
</code></pre>
<p>dll.cpp (wird zu einer DLL gelinkt):</p>
<pre><code class="language-cpp">struct Foo : IFoo
{
    template &lt;typename T&gt;
        virtual void bar (void)
    { ... }
};
__declspec (dllexport) IFoo* createFoo (void)
{ return new Foo; }
</code></pre>
<p>main.cpp (wird zu einer Executable gelinkt):</p>
<pre><code class="language-cpp">__declspec (dllimport) IFoo* createFoo (void);

struct SomeSpecificType
{
    ...
};

int main (void)
{
    createFoo ()-&gt;bar &lt;SomeSpecificType&gt; ();
}
</code></pre>
<p>Wie soll der Compiler beim Übersetzen von dll.cpp wissen, mit welchem Typ die Funktion in der Anwendung tatsächlich instantiiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745362</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 18 Jul 2009 15:04:57 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 16:38:09 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Wie soll der Compiler beim Übersetzen von dll.cpp wissen, mit welchem Typ die Funktion in der Anwendung tatsächlich instantiiert wird?</p>
</blockquote>
<p>Gar nicht, daher müßte man dynamic dispatching in die Sprache integrieren, so daß die Methodenauflösung erst zur Laufzeit erfolgt. D.h. frage Objekt ob es Methode x unterstützt und schicke dann Nachricht an das Objekt, das ist der typische SmallTalk Weg Dispatching zu lösen: langsam aber sehr flexibel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745398</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sat, 18 Jul 2009 16:38:09 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 19:23:37 GMT]]></title><description><![CDATA[<p>Bei</p>
<pre><code class="language-cpp">shared_ptr&lt;command&lt;std::string&gt;&gt; c(new some_command&lt;std::string&gt;());
</code></pre>
<p>kommt:</p>
<pre><code>sorry, unimplemented: cannot expand ‘T ...’ into a fixed-length argument list
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Dabei benutze ich gcc 4.4. Wann wird C++0x endlich vollständig da sein?</p>
<p>Niels</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745477</guid><dc:creator><![CDATA[nielsp]]></dc:creator><pubDate>Sat, 18 Jul 2009 19:23:37 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 19:52:20 GMT]]></title><description><![CDATA[<p>nielsp schrieb:</p>
<blockquote>
<pre><code>sorry, unimplemented: cannot expand ‘T ...’ into a fixed-length argument list
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Dabei benutze ich gcc 4.4. Wann wird C++0x endlich vollständig da sein?</p>
</blockquote>
<p>Zeig mal mehr Code. Ich habe beim G++ 4.3.3 schon ordentlich variadische Templates getestet und habe diese Fehlermeldung noch nie gesehen. Sehr wahrscheinlich kann man das Problem in Deinem Fall umgehen.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745491</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sat, 18 Jul 2009 19:52:20 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 21:01:31 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>audacia schrieb:</p>
<blockquote>
<p>Wie soll der Compiler beim Übersetzen von dll.cpp wissen, mit welchem Typ die Funktion in der Anwendung tatsächlich instantiiert wird?</p>
</blockquote>
<p>Gar nicht, daher müßte man dynamic dispatching in die Sprache integrieren, so daß die Methodenauflösung erst zur Laufzeit erfolgt. D.h. frage Objekt ob es Methode x unterstützt und schicke dann Nachricht an das Objekt, das ist der typische SmallTalk Weg Dispatching zu lösen: langsam aber sehr flexibel.</p>
</blockquote>
<p>Dynamisches Dispatching wie in Smalltalk, JS oder PHP geht an der hier wesentlichen Problematik vorbei. Sicher, hätte man die Voraussetzungen, um generische virtuelle Funktionen zu implementieren (z.B., wie oben erwähnt, in .NET mit Generics), so würde man sich natürlich eines derartigen Dispatching-Mechanismus bedienen. Das wesentliche Problem in C++ ist aber die Bindungslosigkeit von Templates - anders als Generics in .NET sind Templates nicht viel anderes als ein turing-vollständiger und typsicherer Präprozessormechanismus, also müßte das Binary nicht nur über einen JIT-Compiler, sondern über einen nahezu vollständigen C++-Compiler (den Lexer ausgenommen) verfügen.</p>
<p>(Im Übrigen war das eine rhetorische Frage.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745521</guid><dc:creator><![CDATA[audacia|off]]></dc:creator><pubDate>Sat, 18 Jul 2009 21:01:31 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sat, 18 Jul 2009 23:34:14 GMT]]></title><description><![CDATA[<p>audacia|off schrieb:</p>
<blockquote>
<p>Das wesentliche Problem in C++ ist aber die Bindungslosigkeit von Templates - anders als Generics in .NET sind Templates nicht viel anderes als ein turing-vollständiger und typsicherer Präprozessormechanismus, also müßte das Binary nicht nur über einen JIT-Compiler, sondern über einen nahezu vollständigen C++-Compiler (den Lexer ausgenommen) verfügen.</p>
</blockquote>
<p>Ich fände genau das ziemlich cool <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 />
Zugegebenermassen irgendwo total plem, aber irgendwo auch nicht <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/1745587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745587</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 18 Jul 2009 23:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sun, 19 Jul 2009 07:52:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Das Problem mit dem <code>cannot expand ‘T ...’ into a fixed-length argument list'</code> hat sich erledigt <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="🙄"
    />. Das war ein blöder Fehler von mir.</p>
<p>Zunächst aber erst mal mein Code:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;memory&gt;

struct command_base 
{ };

template&lt;typename... T&gt;
class command : public command_base 
{ 
public: 
  virtual void operator()(const T&amp;... parameters);

protected: 
  std::string some_member;
};

template&lt;typename... T&gt;
struct some_command : public command&lt;T...&gt;
{
  virtual void operator()(const T&amp;... parameters) 
  { 
    // verwende auf irgendwelche Art die Parameter
    std::cout &lt;&lt; some_member &lt;&lt; std::endl;
  }
};

int main() 
{
	shared_ptr&lt;command&lt;std::string&gt;&gt; c(new some_command&lt;std::string&gt;());
	static_cast&lt;some_command&lt;std::string&gt;&gt;(c)()(std::string(&quot;1234&quot;));
	return 0;
}
</code></pre>
<p>In der main()-Funktion soll <code>some_command</code> ausgeführt werden.</p>
<p>Die Fehler sind:</p>
<pre><code>In member function ‘virtual void some_command&lt;T&gt;::operator()(const T&amp; ...)’:
 error: ‘some_member’ was not declared in this scope.

In function ‘int main()’:
 error: no matching function for call to ‘some_command&lt;std::string&gt;::some_command(std::shared_ptr&lt;command&lt;std::string&gt;&gt;&amp;)
 ... (dann kommen die ganzen Kandidaten die es gäbe).
</code></pre>
<p>Ich weiß zwar durchaus, was diese Fehlermeldungen zu bedeuten haben, aber ich weiß nicht, warum sie auftreten und also auch nicht, wie sie zu beheben wären.<br />
Danke für die Hilfe!</p>
<p>Niels</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745623</guid><dc:creator><![CDATA[nielsp]]></dc:creator><pubDate>Sun, 19 Jul 2009 07:52:41 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sun, 19 Jul 2009 08:35:52 GMT]]></title><description><![CDATA[<p>Was willst Du überhaupt erreichen?</p>
<p>(Siehe u.a. Punkt 7 von <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html" rel="nofollow">&quot;Du brauchst Hilfe?&quot;</a>)</p>
<p>Die erste Fehlermeldung kommt, weil some_member ein Element einer von einem Template-Parameter abhängigen Basisklasse ist. Du musst dem Compiler signalisieren, dass er für &quot;some_member&quot; die Namensauflösung verzögern soll. Das geht u.a. mit &quot;this-&gt;some_member&quot;.</p>
<blockquote>
<pre><code class="language-cpp">shared_ptr&lt;command&lt;std::string&gt;&gt; c(new some_command&lt;std::string&gt;()); 
 static_cast&lt;some_command&lt;std::string&gt;&gt;(c)()(std::string(&quot;1234&quot;));
</code></pre>
</blockquote>
<p>c ist shared_ptr. Den kannst Du nicht einfach in ein some_command<a href="std::string" rel="nofollow">std::string</a> konvertieren. Außerdem: Was soll das mit dem leeren Klammerpaar? Außerdem: Wenn Du schon weißt, dass der Zeiger auf ein some_command<a href="std::string" rel="nofollow">std::string</a> zeigt, wozu dann noch die -- im übrigen nicht-polymorphe! -- Basisklasse? Was Du hättest schreiben können -- angenommen command_base wär polymorph:</p>
<pre><code class="language-cpp">shared_ptr&lt;some_command&lt;std::string&gt; &gt; foo = 
   dynamic_pointer_cast&lt;some_command&lt;std::string&gt; &gt;(c);
 if (foo) {
   (*foo)(&quot;1234&quot;);
 }
</code></pre>
<p>Du bist Dir auch im Klaren darüber, dass</p>
<pre><code class="language-cpp">command&lt;string&gt; * p = new some_command&lt;string&gt;; 
 delete p;
</code></pre>
<p>undefiniertes Verhalten besitzt, da Du keine virtuellen Destruktoren benutzt, ja?</p>
<p>Ich rate Dir, das Design komplett zu überdenken und zu erwähnen, welches Problem Du damit zu lösen gedenkst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745627</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 19 Jul 2009 08:35:52 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sun, 19 Jul 2009 09:57:20 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>audacia|off schrieb:</p>
<blockquote>
<p>Das wesentliche Problem in C++ ist aber die Bindungslosigkeit von Templates - anders als Generics in .NET sind Templates nicht viel anderes als ein turing-vollständiger und typsicherer Präprozessormechanismus, also müßte das Binary nicht nur über einen JIT-Compiler, sondern über einen nahezu vollständigen C++-Compiler (den Lexer ausgenommen) verfügen.</p>
</blockquote>
<p>Ich fände genau das ziemlich cool <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 />
Zugegebenermassen irgendwo total plem, aber irgendwo auch nicht <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>Ja, die sich ergebenden Möglichkeiten wären nahezu grenzenlos. Aber irgendwie glaube ich, daß Microsoft, Embarcadero, Intel, PathScale etc. nicht so glücklich darüber wären, ihren Benutzern das Deployment ihrer Compiler ermöglichen zu müssen <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/1745647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745647</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 19 Jul 2009 09:57:20 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sun, 19 Jul 2009 18:33:01 GMT]]></title><description><![CDATA[<p>audacia|off schrieb:</p>
<blockquote>
<p>Das wesentliche Problem in C++ ist aber die Bindungslosigkeit von Templates</p>
</blockquote>
<p>Eben das haben sie mit dem Dispatching von Smalltalk gemein. Smalltalk überprüft keinerlei Konzepte während der Übersetzung. Erst während der Laufzeit wird geprüft ob eine Meldung von einem Objekt verstanden wird, und dazu bedarf es keines Compilers. Man muß nur die Methodeninformationen in den Programmcode ablegen.</p>
<p>audacia|off schrieb:</p>
<blockquote>
<p>… also müßte das Binary nicht nur über einen JIT-Compiler, sondern über einen nahezu vollständigen C++-Compiler (den Lexer ausgenommen) verfügen.</p>
</blockquote>
<p>Eben das müßte nicht der Fall sein - siehe Smalltalk. Es reicht aus dynamisches Dispatching auf Basis von Methodennamen, Rückgabetyp und Parametertypliste zu implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745887</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sun, 19 Jul 2009 18:33:01 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Templates on Sun, 19 Jul 2009 18:48:08 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>audacia|off schrieb:</p>
<blockquote>
<p>Das wesentliche Problem in C++ ist aber die Bindungslosigkeit von Templates</p>
</blockquote>
<p>Eben das haben sie mit dem Dispatching von Smalltalk gemein. Smalltalk überprüft keinerlei Konzepte während der Übersetzung. Erst während der Laufzeit wird geprüft ob eine Meldung von einem Objekt verstanden wird, und dazu bedarf es keines Compilers. Man muß nur die Methodeninformationen in den Programmcode ablegen.</p>
</blockquote>
<p>Du hast das Problem nicht verstanden.</p>
<p>~john schrieb:</p>
<blockquote>
<p>audacia|off schrieb:</p>
<blockquote>
<p>… also müßte das Binary nicht nur über einen JIT-Compiler, sondern über einen nahezu vollständigen C++-Compiler (den Lexer ausgenommen) verfügen.</p>
</blockquote>
<p>Eben das müßte nicht der Fall sein - siehe Smalltalk. Es reicht aus dynamisches Dispatching auf Basis von Methodennamen, Rückgabetyp und Parametertypliste zu implementieren.</p>
</blockquote>
<p>Nein. Um virtuelle Templatefunktionen haben zu können, muß es möglich sein, sie zur Laufzeit mit beliebigen Typen zu instantiieren. Und das geht nicht ohne einen C++-Compiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1745894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1745894</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 19 Jul 2009 18:48:08 GMT</pubDate></item></channel></rss>