<?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[lambda als Funktionsparameter]]></title><description><![CDATA[<p>Ich habe folgenden code:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;functional&gt;
using namespace std;

template&lt;typename R, typename A&gt;
void createAccessor(R(*acc)(A))
{
	std::function&lt;R(A)&gt; func = acc;
}

int main() {
	createAccessor([](int arg){ return 42; });
	return 0;
}
</code></pre>
<blockquote>
<p>prog.cpp: In function ‘int main()’:<br />
prog.cpp:12:42: error: no matching function for call to ‘createAccessor(main()::__lambda0)’<br />
createAccessor([](int arg){ return 42; });</p>
</blockquote>
<p>Wieso kann ich nicht das lambda als Funktionsparameter übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324178/lambda-als-funktionsparameter</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 20:26:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324178.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Mar 2014 22:44:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to lambda als Funktionsparameter on Wed, 05 Mar 2014 22:44:04 GMT]]></title><description><![CDATA[<p>Ich habe folgenden code:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;functional&gt;
using namespace std;

template&lt;typename R, typename A&gt;
void createAccessor(R(*acc)(A))
{
	std::function&lt;R(A)&gt; func = acc;
}

int main() {
	createAccessor([](int arg){ return 42; });
	return 0;
}
</code></pre>
<blockquote>
<p>prog.cpp: In function ‘int main()’:<br />
prog.cpp:12:42: error: no matching function for call to ‘createAccessor(main()::__lambda0)’<br />
createAccessor([](int arg){ return 42; });</p>
</blockquote>
<p>Wieso kann ich nicht das lambda als Funktionsparameter übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386982</guid><dc:creator><![CDATA[Nash26]]></dc:creator><pubDate>Wed, 05 Mar 2014 22:44:04 GMT</pubDate></item><item><title><![CDATA[Reply to lambda als Funktionsparameter on Wed, 05 Mar 2014 22:59:07 GMT]]></title><description><![CDATA[<p>Weil ein Lambda kein Funktionszeiger ist. Er lässt sich lediglich in einen Konvertieren (da hier keine captures vorhanden sind), aber das hat keinen Einfluss auf die Deduzierung der Template-Argumente.</p>
<p>Das hier kompiliert</p>
<pre><code>void createAccessor( int(*acc)(int) )
{
    std::function&lt;int(int)&gt; func = acc;
}

createAccessor([](int arg){ return 42; });
</code></pre>
<p>Was du natürlich tun könntest ist vor dem Aufruf explizit casten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386987</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 05 Mar 2014 22:59:07 GMT</pubDate></item><item><title><![CDATA[Reply to lambda als Funktionsparameter on Wed, 05 Mar 2014 22:59:16 GMT]]></title><description><![CDATA[<p>Die vollständige Meldung beim g++ 4.8.1 lautet:</p>
<blockquote>
<p>lambda.cpp: In function ‘int main()’:<br />
lambda.cpp:12:45: error: no matching function for call to ‘createAccessor(main()::__lambda0)’<br />
createAccessor([](int arg){ return 42; });<br />
^<br />
lambda.cpp:12:45: note: candidate is:<br />
lambda.cpp:6:6: note: template&lt;class R, class A&gt; void createAccessor(R (*)(A))<br />
void createAccessor(R(<em>acc)(A))<br />
^<br />
lambda.cpp:6:6: note: template argument deduction/substitution failed:<br />
lambda.cpp:12:45: note: mismatched types ‘R (</em>)(A)’ and ‘main()::__lambda0’<br />
createAccessor([](int arg){ return 42; });</p>
</blockquote>
<p>Da der Lambdaausdruck kein Funktionspointer ist, sondern nur in einen konvertiert werden kann, geht es nicht automatisch. So gehts:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;functional&gt;
using namespace std;

template&lt;typename R, typename A&gt;
void createAccessor(R(*acc)(A))
{
    std::function&lt;R(A)&gt; func = acc;
}

int main() {
    int(*acc)(int) = [](int arg){ return 42; };
    createAccessor(acc);
    return 0;
}
</code></pre>
<p>Oder du benutzt gleich std::function als Parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386988</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 05 Mar 2014 22:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to lambda als Funktionsparameter on Wed, 05 Mar 2014 23:03:05 GMT]]></title><description><![CDATA[<blockquote>
<p>Oder du benutzt gleich std::function als Parameter.</p>
</blockquote>
<p><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="👍"
    /><br />
Dann stellt sich allerdings die Frage, warum nicht gleich einfach</p>
<pre><code>template&lt;typename T&gt;
void foo( T bar )
{
    // ... bar(arg)
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2386989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386989</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 05 Mar 2014 23:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to lambda als Funktionsparameter on Wed, 05 Mar 2014 23:03:37 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Oder du benutzt gleich std::function als Parameter.</p>
</blockquote>
<p>Dann funktioniert die Typherleitung aber auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386992</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 05 Mar 2014 23:03:37 GMT</pubDate></item><item><title><![CDATA[Reply to lambda als Funktionsparameter on Wed, 05 Mar 2014 23:14:51 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Oder du benutzt gleich std::function als Parameter.</p>
</blockquote>
<p>Dann funktioniert die Typherleitung aber auch nicht.</p>
</blockquote>
<p>Ohne Witz, meine erste Version des Postings oben war &quot;Was ändert das?&quot;.</p>
<p>Ich hasse Denkfehler, ich hasse sie so sehr <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/2386995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386995</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 05 Mar 2014 23:14:51 GMT</pubDate></item><item><title><![CDATA[Reply to lambda als Funktionsparameter on Thu, 06 Mar 2014 18:53:41 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Oder du benutzt gleich std::function als Parameter.</p>
</blockquote>
<p>Das bringt doch aber nichts, da kann ich trotzdem nicht</p>
<pre><code>createAccessor([](int arg){ return 42; });
</code></pre>
<p>aufrufen.<br />
Oder was meinst du?</p>
<p>Was ich machen könnte ist folgendes:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;functional&gt;
using namespace std;

template&lt;typename R, typename A&gt;
void createAccessor(R(*acc)(A))
{
    std::function&lt;R(A)&gt; func = acc;
}

int main() {
    createAccessor&lt;int,int&gt;([](int arg){ return 42; });
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2387214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387214</guid><dc:creator><![CDATA[Nash26]]></dc:creator><pubDate>Thu, 06 Mar 2014 18:53:41 GMT</pubDate></item></channel></rss>