<?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[Parametertypen eines Funktionszeigers als Template-Parameter?]]></title><description><![CDATA[<p>Folgender Code demonstriert, was ich will:</p>
<pre><code class="language-cpp">void bar (void) {}

template &lt;typename Retval, typename Param1&gt;
    void foo (Retval (*val) (Param1)) {}

int main (void)
{
    foo (bar);
}
</code></pre>
<p>Leider meinen sowohl BCC als auch Comeau Online, daß keine Funktion foo gefunden worden sei, die einen Parameter vom Typ void (*) (void) übernimmt, demnach scheint das so nicht zu gehen.<br />
Gibt es einen anderen Weg, an die einzelnen Parametertypen eines Funktionszeigers heranzukommen? Wird es das evtl. mit C++0x geben? Oder muß ich weiterhin</p>
<pre><code class="language-cpp">foo &lt;void, void&gt; (bar);
</code></pre>
<p>schreiben?</p>
<p><em>Edit: überflüssiges typedef entfernt</em></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184761/parametertypen-eines-funktionszeigers-als-template-parameter</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 01:45:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184761.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Jun 2007 23:36:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 00:14:33 GMT]]></title><description><![CDATA[<p>Folgender Code demonstriert, was ich will:</p>
<pre><code class="language-cpp">void bar (void) {}

template &lt;typename Retval, typename Param1&gt;
    void foo (Retval (*val) (Param1)) {}

int main (void)
{
    foo (bar);
}
</code></pre>
<p>Leider meinen sowohl BCC als auch Comeau Online, daß keine Funktion foo gefunden worden sei, die einen Parameter vom Typ void (*) (void) übernimmt, demnach scheint das so nicht zu gehen.<br />
Gibt es einen anderen Weg, an die einzelnen Parametertypen eines Funktionszeigers heranzukommen? Wird es das evtl. mit C++0x geben? Oder muß ich weiterhin</p>
<pre><code class="language-cpp">foo &lt;void, void&gt; (bar);
</code></pre>
<p>schreiben?</p>
<p><em>Edit: überflüssiges typedef entfernt</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308749</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 19 Jun 2007 00:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Mon, 18 Jun 2007 23:57:24 GMT]]></title><description><![CDATA[<p>Hi,<br />
das Problem liegt daran, dass void nicht als Parameter zählt. Es könnte genauso gut nichts da stehen.</p>
<p>Deinem</p>
<pre><code class="language-cpp">template &lt;typename Retval, typename Param1&gt;
    void foo (Retval (*val) (Param1)) {}
</code></pre>
<p>übergibst du ein Zeiger auf eine Funktion mit dem Rückgabetyp void.</p>
<p>Da ist nichts mit Param1. Also sollte das es tun:</p>
<pre><code class="language-cpp">template &lt;typename Retval&gt;
    void foo (Retval (*val) ()) {}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1308753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308753</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 18 Jun 2007 23:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Mon, 18 Jun 2007 23:59:01 GMT]]></title><description><![CDATA[<p>du kannst fuer void spezialisieren:</p>
<pre><code class="language-cpp">template &lt;typename Retval&gt; 
    void foo (Retval (*val) ()) {  }
</code></pre>
<p>Problem ist, soweit ich es verstehe, dass void eben kein parameter typ ist. void(<em>)(void) ist eben das selbe wie void(</em>)() und da gibt es keinen param vom typ void sondern garkeinen parameter. dein template erwartet aber eine funktion mit einem param und du gibst ihr eine mit keinem.</p>
<p>Edit:<br />
ich lahme Ente ich <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/1308754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308754</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 18 Jun 2007 23:59:01 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 00:01:22 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Noch ne Nachteule.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308756</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 19 Jun 2007 00:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 00:13:57 GMT]]></title><description><![CDATA[<p>Tatsächlich. Dann war das nur ein Denkfehler, und das Minimalbeispiel ist nicht so ganz zutreffend gewesen; mein Problem besteht weiterhin. Ich muß nochmal nachschauen gehen.</p>
<p>...ich hab es gefunden.<br />
Hier tritt es auf:</p>
<pre><code class="language-cpp">struct bar_t
{
    void bar (int) {}
};

template &lt;typename Retval, typename Param1&gt;
    void foo (Retval (__closure* val) (Param1)) {}

int main (void)
{
    bar_t b;
    foo (b.bar);
}
</code></pre>
<p>Allerdings tritt es nur bei der Borland-Compilererweiterung __closure auf. Das höchste, was ich machen kann, ist da wohl, ein Feature-Request an CodeGear zu schicken <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/1308757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308757</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 19 Jun 2007 00:13:57 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 01:07:10 GMT]]></title><description><![CDATA[<p>du hast hier keine funktion <code>void(*)(int)</code> sondern eine funktion <code>void(bar_t::*)(int)</code> , und ja, das ist etwas anderes. (intern implementiert wahrscheinlich als <code>void (*) (bar_t* this, int)</code> )</p>
<p>die elementfunktion bräuchte nämlich eine instanz, auf die sie wirkt, aber die hat sie nicht. folgendes funktioniert:</p>
<pre><code class="language-cpp">struct bar_t
{
    void bar (int) {}
};

template &lt;typename Retval, typename Param1, class C&gt;
    void foo (Retval (C::*val) (Param1)) 
{
   C x;
   (x.*val) (42);
}

int main (void)
{
    foo (&amp;bar_t::bar);
}
</code></pre>
<p>oder du gibst irgendwie ein bar_t objekt mit, für das die elementfunktion aufgerufen werden soll.<br />
oder du verwendest delegates/funktionsobjekte:</p>
<pre><code class="language-cpp">#include &lt;functional&gt;

struct bar_t
{
    void bar (int) {}
};

template &lt;typename T&gt;
    void foo (T fun) 
{
   fun (42);
}

int main ()
{
    bar_t x;
    foo (std::bind1st(std::mem_fun(&amp;bar_t::bar), &amp;x));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1308763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308763</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Tue, 19 Jun 2007 01:07:10 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 12:02:10 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>du hast hier keine funktion <code>void(*)(int)</code> sondern eine funktion <code>void(bar_t::*)(int)</code> , und ja, das ist etwas anderes. (intern implementiert wahrscheinlich als <code>void (*) (bar_t* this, int)</code> )</p>
<p>die elementfunktion bräuchte nämlich eine instanz, auf die sie wirkt, aber die hat sie nicht.</p>
</blockquote>
<p>Doch. Folgendes funktioniert auch:</p>
<pre><code class="language-cpp">struct bar_t
{
    void bar (int) {}
};

template &lt;typename Retval, typename Param1&gt;
    void foo (Retval (__closure* val) (Param1)) {}

int main (void)
{
    bar_t b;
    foo &lt;void, int&gt; (b.bar);
}
</code></pre>
<p>Closures sind nicht gewöhnliche Methodenzeiger, sie liefern ein Objekt gleich mit. Die (nicht standardkonforme) Anweisung b.bar gibt ein solches Closure zurück.<br />
Die Implementation ist etwa so:</p>
<pre><code class="language-cpp">struct TMethod
{
    void* Code;
    void* Data;
};
</code></pre>
<p>Hierbei verweist Code auf die Adresse der Methode und Data auf das Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309067</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 19 Jun 2007 12:02:10 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 12:22:13 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">__closure
</code></pre>
<p>...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> *wtf*</p>
<p>tja, mit derlei &quot;Sonderschmökens&quot; kannst Du natürlich alles begründen.<br />
...und gleichzeitig belegt das wieder mal, wie sinnvoll es ist, sich auf dem Boden des Standards zu bewegen:</p>
<ul>
<li>Die allermeisten können Dir dabei nicht weiterhelfen,</li>
<li>beim nächsten Compiler klappt das auch nicht mehr,</li>
<li>queer_boys Aussage bleibt trotzdem richtig, weil er sich auf den Standard bezieht und</li>
<li>dieses &quot;Feature&quot; verschleiert einen (dem Standard) wichtigen Unterschied zwischen Member- und freien Funktionen.</li>
</ul>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309089</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 19 Jun 2007 12:22:13 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 13:42:21 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>tja, mit derlei &quot;Sonderschmökens&quot; kannst Du natürlich alles begründen.</p>
</blockquote>
<p>???</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>...und gleichzeitig belegt das wieder mal, wie sinnvoll es ist, sich auf dem Boden des Standards zu bewegen:</p>
</blockquote>
<p>Mag ja sein, aber es gibt Dinge, die in Standard-C++ einfach fehlen. Neben besserer RTTI und Persistenzfeatures ist es z.B. das hier <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>Simon2 schrieb:</p>
<blockquote>
<p>Die allermeisten können Dir dabei nicht weiterhelfen</p>
</blockquote>
<p>Im ersten Post ging ich ja auch davon aus, ein compilerunabhängiges Problem zu haben. Im nächsten hatte ich dann festgestellt, daß das Problem nur bei diesem Schlüsselwort auftritt, somit compilerspezifisch und von dessen Hersteller zu beheben ist. Meine Frage hier war damit beantwortet.</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>beim nächsten Compiler klappt das auch nicht mehr</p>
</blockquote>
<p>Das nimmt man in Kauf, wenn man sich auf die Lösung eines Herstellers verläßt.</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>queer_boys Aussage bleibt trotzdem richtig, weil er sich auf den Standard bezieht</p>
</blockquote>
<p>Er hat argumentiert, wie es wäre, wenn ich einen Methodenzeiger verwendet hätte. Das war zwar richtig, jedoch tat ich das nicht.</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>dieses &quot;Feature&quot; verschleiert einen (dem Standard) wichtigen Unterschied zwischen Member- und freien Funktionen.</p>
</blockquote>
<p>Kann es sein, daß du dir dieses &quot;Feature&quot; nochmal ansehen solltest, bevor du so darüber urteilst?<br />
Alle Alternativen, die in C++ für Delegates aka Closures existieren, sind entweder implementationsspezifische Hacks (<a href="http://www.codeproject.com/cpp/FastDelegate.asp" rel="nofollow">Fast Delegates</a>) oder langsam und klobig (boost.function). __closure verschleiert keinen Unterschied, es ist eine compilerspezifische, aber maximal effiziente Implementation von Delegates.</p>
<p>Und da es z.B. von der VCL intensiv verwendet wird, stellt sich auch gar nicht die Frage, ob man es benutzt oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309163</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 19 Jun 2007 13:42:21 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 14:02:24 GMT]]></title><description><![CDATA[<p>Na, dann ist ja alles gut ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309181</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 19 Jun 2007 14:02:24 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 16:17:50 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Mag ja sein, aber es gibt Dinge, die in Standard-C++ einfach fehlen. Neben besserer RTTI und Persistenzfeatures ist es z.B. das hier <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>Stimmt doch garnicht:</p>
<pre><code class="language-cpp">struct bar_t
{
    void bar (int) {}
};

template &lt;typename Retval, typename Param1&gt;
void foo (std::tr1::function&lt; Retval (Param1) &gt; val) {}

int main (void)
{
    bar_t b;
	foo &lt;void, int&gt; (std::tr1::bind( &amp;bar_t::bar, &amp;b, _1 ));
}
</code></pre>
<p><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>Was klobig angeht, habe ich noch keine Untersuchungen gestartet, ich gehe aber davon aus dass das meiste im Releasemode wegoptimiert wird. Ist die Frage ob der BCC das intern besser handhaben kann. Und von Delegates in z.B. .NET hört man auch nicht immer nur gutes, was das Tempo angeht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309264</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 19 Jun 2007 16:17:50 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Tue, 19 Jun 2007 18:13:55 GMT]]></title><description><![CDATA[<p>Es hat ja niemand etwas gegen Compilererweiterungen, aber warum postest du bei einem Problem mit einer Erweiterung im Standard-C++ Forum wenn es extra ein Forum für den Borland Compiler gibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309327</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Tue, 19 Jun 2007 18:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Fri, 22 Jun 2007 01:40:34 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Ist die Frage ob der BCC das intern besser handhaben kann.</p>
</blockquote>
<p>Das kann er - weil es ein Sprachmittel ist. Ein Closure enthält (wie weiter oben beschrieben) nur zwei Zeiger: einen auf die Adresse der Methode, einen auf die zugehörige Klasseninstanz. Dementsprechend schnell ist der Aufruf. Das ist auch der wesentliche Vorteil gegenüber std::tr1::function oder boost::function <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>Benchmarks findest du z.B. hier:<br />
<a href="http://www.codeproject.com/cpp/FastDelegate2.asp" rel="nofollow">http://www.codeproject.com/cpp/FastDelegate2.asp</a><br />
(Zur Info: Closures sind noch schneller als alle vier hier - und boost::function ist ganz rechts <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>Der eigentliche Grund für die Existenz dieser Compilererweiterung war aber die für C++Builder 1.0 angestrebte ABI-Kompatibilität des BCC mit Delphi und die Tatsache, daß Funktionszeiger in Delphi etwas sind, für das es in Standard-C++ kein Äquivalent gibt. Und das war 1997. Ganz abgesehen davon, daß jede standardkonforme Implementation viel zu klobig und C++-spezifisch ist, um in das Delphi-ABI passen zu können: damals gab es so etwas wie std::tr1::function vermutlich noch nicht <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>LordJaxom schrieb:</p>
<blockquote>
<p>Und von Delegates in z.B. .NET hört man auch nicht immer nur gutes, was das Tempo angeht.</p>
</blockquote>
<p>Das kann man von .NET eigentlich auch ganz allgemein sagen :p *scnr*</p>
<p>lolz schrieb:</p>
<blockquote>
<p>Es hat ja niemand etwas gegen Compilererweiterungen, aber warum postest du bei einem Problem mit einer Erweiterung im Standard-C++ Forum wenn es extra ein Forum für den Borland Compiler gibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
</blockquote>
<p>Weil ich zunächst fälschlicherweise annahm, daß es sich nicht um ein compilerspezifisches Problem handelt?<br />
Das erwähne ich übrigens gerade zum dritten Mal. Du hättest ja einfach mal weiter oben lesen können <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/1311109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311109</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 22 Jun 2007 01:40:34 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Fri, 22 Jun 2007 07:07:52 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich persönlich finde ja, dass &quot;Performance&quot; nicht das einzige Kritierium zur Beurteilung eines Features sein sollte. C++ macht einfach keinerlei ABI-Aussagen - das kann man mögen (Freiheit für die Compilerentwicklung) oder nicht (ABI-Mix).<br />
.... aber ist ja alles OK, wenn Du Dein Problem nun gelöst hast.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311177</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 22 Jun 2007 07:07:52 GMT</pubDate></item><item><title><![CDATA[Reply to Parametertypen eines Funktionszeigers als Template-Parameter? on Fri, 22 Jun 2007 12:26:01 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>ich persönlich finde ja, dass &quot;Performance&quot; nicht das einzige Kritierium zur Beurteilung eines Features sein sollte.</p>
</blockquote>
<p>Natürlich nicht. Der Punkt ist nur: Methodenzeiger in C++ und alle Tricks, die landläufig so benutzt werden, um mit ihnen und einem Objektzeiger Closures zu implementieren, sind viel klobiger, als sie sein müßten. Ein Methodenzeiger, der nicht an ein Objekt gebunden ist, muß darauf vorbereitet sein, auf eine herkömmliche Funktion, eine virtuelle Funktion, eine Funktion aus einer virtuell abgeleiteten Klasse und eine Funktion aus einer von mehreren Basisklassen, für die das Objekt eine andere Adresse hätte, enthalten zu können (die Liste erhebt keinen Anspruch auf Vollständigkeit <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="😉"
    /> ). Das ist zum Teil auch der Ballast, den sich C++ durch die Unterstützung von Mehrfachvererbung aufbürdet. Da ein Methodenzeiger nur die Methode, nicht aber das Objekt kennt, muß er all diese Informationen zur Laufzeit bereithalten und auch darüber entscheiden, wenn er mit einem konkreten Objekt aufgerufen wird.<br />
Wenn du aber schon bei der Zuweisung einer Methode ein konkretes Objekt angibst - wie das bei Closures der Fall ist -, dann lassen sich die genaue Adresse der Funktion (z.B. VTable) und der passende Objektzeiger (z.B. bei mehreren Basisklassen) schon bei der Zuweisung feststellen. Im Closure müssen also nur ein Methoden- und ein Objektzeiger gespeichert werden, und der Aufruf ist ganze zwei Instruktionen lang:</p>
<pre><code class="language-asm">push [Data] ; Objektzeiger
call [Code] ; Funktionszeiger
</code></pre>
<p>Simon2 schrieb:</p>
<blockquote>
<p>C++ macht einfach keinerlei ABI-Aussagen - das kann man mögen (Freiheit für die Compilerentwicklung) oder nicht (ABI-Mix).</p>
</blockquote>
<p>Das ist nicht das Problem. Problematisch ist, daß Lösungen, die mit C++-Methodenzeigern arbeiten, nicht binärkompatibel zu Delphis Funktionszeigern gemacht werden <em>können</em>, da sie in jedem Fall mehr als diese zwei Zeiger mit sich herumtragen.</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>.... aber ist ja alles OK, wenn Du Dein Problem nun gelöst hast.</p>
</blockquote>
<p>So ist es <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/1311439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311439</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 22 Jun 2007 12:26:01 GMT</pubDate></item></channel></rss>