<?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[Funktion mithilfe von Templates zurückgeben]]></title><description><![CDATA[<p>gegeben sei:</p>
<pre><code class="language-cpp">template &lt;class T, void (T::*method)(int)&gt;
void invoke(T* objPtr, int i)
{
	(objPtr-&gt;*method)(i);
}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">struct Foo
{
	void test(int i) // zu Testzwecken kein const, bitte keine Vorträge diesbezüglich ;)
	{
		std::cout &lt;&lt; &quot;test(&quot; &lt;&lt; i &lt;&lt; ')' &lt;&lt; std::endl;
	}
};
</code></pre>
<p>mithilfe von</p>
<pre><code class="language-cpp">typedef void (*func)(Foo*, int);

int main(void)
{
	Foo bar;
    func function = &amp;invoke&lt;Foo, &amp;Foo::test&gt;;
    function(&amp;bar, 10);
}
</code></pre>
<p>erhalte ich die gewünschte Ausgabe (&quot;test(10)&quot;)</p>
<p>Jetzt zu meiner eigentlichen Frage, wie kann ich das zurückgeben der invoke-Funktion in eine Funktion verpacken, damit ich einen Funktionsaufruf wie folgenden machen kann?</p>
<pre><code class="language-cpp">func function = getFunction(&amp;bar, &amp;Foo::test);
</code></pre>
<p>meine Idee war</p>
<pre><code class="language-cpp">template &lt;class T&gt;
func getFunction(T&amp; t, void (T::*function)(int))
{
	return &amp;invoke&lt;t, function&gt;;
}
</code></pre>
<p>was leider nicht ganz funktioniert. Hat da jemand nen Verbesserungsvorschlag?</p>
<p>Cheers<br />
Cyres</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306762/funktion-mithilfe-von-templates-zurückgeben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 08:33:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306762.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Aug 2012 20:11:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 20:11:57 GMT]]></title><description><![CDATA[<p>gegeben sei:</p>
<pre><code class="language-cpp">template &lt;class T, void (T::*method)(int)&gt;
void invoke(T* objPtr, int i)
{
	(objPtr-&gt;*method)(i);
}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">struct Foo
{
	void test(int i) // zu Testzwecken kein const, bitte keine Vorträge diesbezüglich ;)
	{
		std::cout &lt;&lt; &quot;test(&quot; &lt;&lt; i &lt;&lt; ')' &lt;&lt; std::endl;
	}
};
</code></pre>
<p>mithilfe von</p>
<pre><code class="language-cpp">typedef void (*func)(Foo*, int);

int main(void)
{
	Foo bar;
    func function = &amp;invoke&lt;Foo, &amp;Foo::test&gt;;
    function(&amp;bar, 10);
}
</code></pre>
<p>erhalte ich die gewünschte Ausgabe (&quot;test(10)&quot;)</p>
<p>Jetzt zu meiner eigentlichen Frage, wie kann ich das zurückgeben der invoke-Funktion in eine Funktion verpacken, damit ich einen Funktionsaufruf wie folgenden machen kann?</p>
<pre><code class="language-cpp">func function = getFunction(&amp;bar, &amp;Foo::test);
</code></pre>
<p>meine Idee war</p>
<pre><code class="language-cpp">template &lt;class T&gt;
func getFunction(T&amp; t, void (T::*function)(int))
{
	return &amp;invoke&lt;t, function&gt;;
}
</code></pre>
<p>was leider nicht ganz funktioniert. Hat da jemand nen Verbesserungsvorschlag?</p>
<p>Cheers<br />
Cyres</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239436</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Mon, 06 Aug 2012 20:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 20:37:37 GMT]]></title><description><![CDATA[<p>C++11 auto std::function std::bind ...</p>
<p>1.) func ist nicht vom Typ F::*method.<br />
2.) gibt es alles schon, std::function mit std::bind ist dein Freund, leider erst ab C++11</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239439</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 06 Aug 2012 20:37:37 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 20:41:13 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>2.) gibt es alles schon, std::function mit std::bind ist dein Freund, leider erst ab C++11</p>
</blockquote>
<p>In boost gibt's das schon für ältere Compiler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239440</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 06 Aug 2012 20:41:13 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 20:47:09 GMT]]></title><description><![CDATA[<p>Ich mag kein boost. Nur manchmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239441</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 06 Aug 2012 20:47:09 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 20:50:33 GMT]]></title><description><![CDATA[<p>Ein solches bind gibt's auch schon in tr1, dann hat man's auch offiziell von vielen Compilern unterstützt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239442</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 06 Aug 2012 20:50:33 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 21:00:20 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>1.) func ist nicht vom Typ F::*method.</p>
</blockquote>
<p>Das ist gewollt, func soll die Funktion &quot;invoke&quot; speichern. Wiegesagt, ohne &quot;getFunction&quot; geht es ja.</p>
<p>knivil schrieb:</p>
<blockquote>
<p>2.) gibt es alles schon, std::function mit std::bind ist dein Freund, leider erst ab C++11</p>
</blockquote>
<p>Ich benutze eh C++11, in dem Sinne nicht das Problem <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>manni66 schrieb:</p>
<blockquote>
<p>In boost gibt's das schon für ältere Compiler</p>
</blockquote>
<p>Die Boost-Lösung ist mir zu langsam, dadurch, dass in der main direkt &quot;function&quot; aufgerufen werden kann, spart das vorallem mit dem Release-Build sehr viel Zeit, die Zeit entspricht dann in etwa einem normalem Funktionsaufruf, Boost benötigt dafür etwa die 10x Zeit <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="😮"
    /><br />
Ist std::function schneller als Boost?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239444</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Mon, 06 Aug 2012 21:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 21:03:32 GMT]]></title><description><![CDATA[<p>Cyres schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>In boost gibt's das schon für ältere Compiler</p>
</blockquote>
<p>Die Boost-Lösung ist mir zu langsam, dadurch, dass in der main direkt &quot;function&quot; aufgerufen werden kann, spart das vorallem mit dem Release-Build sehr viel Zeit, die Zeit entspricht dann in etwa einem normalem Funktionsaufruf, Boost benötigt dafür etwa die 10x Zeit <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="😮"
    /><br />
Ist std::function schneller als Boost?</p>
</blockquote>
<p>Ich behaupte mal, du machst bei der Messung etwas falsch. Das ist alles nur Abstraktion, Unterschiede sollte es nur in der Compilezeit geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239445</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 06 Aug 2012 21:03:32 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 21:07:16 GMT]]></title><description><![CDATA[<p>Die Zeit habe ich wärend der Ausführung des Programmes bestimmt <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">template &lt;class T&gt;
void getFunction(T&amp; t, void (T::*function)(int))
{
	func fun = &amp;invoke&lt;T, function&gt;;
}
</code></pre>
<p>Ich bekomme dabei den folgenden Fehler:<br />
- error: parse error in template argument list</p>
<p>Was er bedeutet ist mir klar, er Kann &quot;function&quot; nicht als Template-Argument gebrauchen, und ich weiß nicht warum, weil der Typ müsste doch der gleiche sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239446</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Mon, 06 Aug 2012 21:07:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 21:32:50 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;class T&gt;
void getFunction(T&amp; t, void (T::*function)(int))
{
	func fun = &amp;invoke&lt;T, function&gt;;
}
</code></pre>
<p>Der Wert von <code>T::*function</code> ist ein Funktionsparameter und kann sich zur Laufzeit aendern. Er kann deswegen nicht als Templateparameter verwendet werden. Es ist eben kein Typ. In deinem Ausgangsbeispiel funktionier das, da Wert <code>Foo::test</code> zur Kompilezeit bekannt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239454</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 06 Aug 2012 21:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 21:34:07 GMT]]></title><description><![CDATA[<p>Klar, darauf hätte ich auch selber kommen 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="🙄"
    /> besten Dank!</p>
<p>Ich gucke mir später oder morgen mal die bind und function aus C++11 an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239457</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Mon, 06 Aug 2012 21:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Mon, 06 Aug 2012 23:09:52 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Cyres schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>In boost gibt's das schon für ältere Compiler</p>
</blockquote>
<p>Die Boost-Lösung ist mir zu langsam, dadurch, dass in der main direkt &quot;function&quot; aufgerufen werden kann, spart das vorallem mit dem Release-Build sehr viel Zeit, die Zeit entspricht dann in etwa einem normalem Funktionsaufruf, Boost benötigt dafür etwa die 10x Zeit <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="😮"
    /><br />
Ist std::function schneller als Boost?</p>
</blockquote>
<p>Ich behaupte mal, du machst bei der Messung etwas falsch. Das ist alles nur Abstraktion, Unterschiede sollte es nur in der Compilezeit geben.</p>
</blockquote>
<p>Wer sagt denn dass Abstraktion keine Laufzeitkosten haben kann? Quasi jede Abstraktion die nicht vollstdänig inlined werden kann hat Laufzeitkosten, und std/boost::function kann halt meistens nicht vollständig inlined werden. Weil es halt Polymorphie auf die eine oder andere Art erfordert (entweder klassisch oder über Type-Erasure).</p>
<p>Davon auszugehen dass boost/std::function gleich schnell ist wie ein Call über eine Trampolin-Funktion (die idealerweise auf einem einzigen &quot;jump&quot; Besteht) finde ich schon sehr gewagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239469</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 06 Aug 2012 23:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Tue, 07 Aug 2012 00:33:22 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Cyres schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>In boost gibt's das schon für ältere Compiler</p>
</blockquote>
<p>Die Boost-Lösung ist mir zu langsam, dadurch, dass in der main direkt &quot;function&quot; aufgerufen werden kann, spart das vorallem mit dem Release-Build sehr viel Zeit, die Zeit entspricht dann in etwa einem normalem Funktionsaufruf, Boost benötigt dafür etwa die 10x Zeit <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="😮"
    /><br />
Ist std::function schneller als Boost?</p>
</blockquote>
<p>Ich behaupte mal, du machst bei der Messung etwas falsch. Das ist alles nur Abstraktion, Unterschiede sollte es nur in der Compilezeit geben.</p>
</blockquote>
<p>Wer sagt denn dass Abstraktion keine Laufzeitkosten haben kann? Quasi jede Abstraktion die nicht vollstdänig inlined werden kann hat Laufzeitkosten, und std/boost::function kann halt meistens nicht vollständig inlined werden. Weil es halt Polymorphie auf die eine oder andere Art erfordert (entweder klassisch oder über Type-Erasure).</p>
<p>Davon auszugehen dass boost/std::function gleich schnell ist wie ein Call über eine Trampolin-Funktion (die idealerweise auf einem einzigen &quot;jump&quot; Besteht) finde ich schon sehr gewagt.</p>
</blockquote>
<p>Dass die Tests durchaus vom Compiler abhängen ist mir bewusst, ich benutze derzeit g++ 4.7, da mit -O3. Aufgrund dessen, da mit der Templatesyntax wie im ersten Post einem Funktionspointer direkt eine Funktion zugeordnet wurde, gibt es halt keinen Overhead wie beim dynamischen Binden etc., was, wie du schon sagtest, weder bei boost::function, noch bei std::function funktionieren wird/kann. Nichts desto trotz ist es Fakt, dass es schnellere Implementationen von delegates gibt. Ob es dadurch besser wird ist eine andere sache. Und für gewöhnlich werden solche Delegates ja auch nicht für laufzeitkritische Dinge benutzt, häufig eher für sachen wie Callbacks/Gui-Benachrichtigung etc.</p>
<p>Ich wollte hier aber auch keine große Disskussion anfechten, warum die simple schreibweise nicht so funktioniert wie z.B. bei Boost ist mir jetzt klar <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>Als Beispielimplementation, wie ich sie oben meinte, würde ich jetzt aufführen: (Links führen alle nach <a href="http://www.codeproject.com" rel="nofollow">www.codeproject.com</a>, falls das nicht erwünscht ist, nehme ich sie wieder raus)</p>
<ul>
<li><a href="http://www.codeproject.com/Articles/11015/The-Impossibly-Fast-C-Delegates" rel="nofollow">The Impossibly Fast C++ Delegates</a> von Sergey Ryazanov</li>
<li><a href="http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible" rel="nofollow">Member Function Pointers and the Fastest Possible C++ Delegates</a> von Don Clugston</li>
<li><a href="http://www.codeproject.com/Articles/13287/Fast-C-Delegate" rel="nofollow">Fast C++ Delegate</a> von JaeWook Choi</li>
</ul>
<p>Ein interessanter Artikel darüber auch auf <a href="http://www.stackoverflow.com" rel="nofollow">www.stackoverflow.com</a>: <a href="http://stackoverflow.com/questions/4298408/5-years-later-is-there-something-better-than-the-fastest-possible-c-delegate" rel="nofollow">5 years later, is there something better than the “Fastest Possible C++ Delegates”?</a></p>
<p>\edit: codeporject in codeproject verbessert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239478</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Tue, 07 Aug 2012 00:33:22 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Tue, 07 Aug 2012 17:03:43 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29208">@Cyres</a><br />
Meine Antwort war ja auch an SeppJ gerichtet, der meinte es müsste an deiner Messung was nicht stimmen. Was ich eben nicht glaube, deine Messung kann schon passen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239753</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 07 Aug 2012 17:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mithilfe von Templates zurückgeben on Tue, 07 Aug 2012 17:05:41 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29208">@Cyres</a><br />
Meine Antwort war ja auch an SeppJ gerichtet, der meinte es müsste an deiner Messung was nicht stimmen. Was ich eben nicht glaube, deine Messung kann schon passen.</p>
</blockquote>
<p>Hab ich auch erst beim zweiten mal bemerkt, trotzallem trägt es ja zum Thema bei, nichts für Ungut <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2239756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239756</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Tue, 07 Aug 2012 17:05:41 GMT</pubDate></item></channel></rss>