<?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 an Funktion übergeben]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>ich fange gerade an, C++0x zu verstehen. Nun versuche ich, eine Funktion zu schreiben, an die ich per Parameter eine Lambda Expression übergeben kann.</p>
<p>Wie muss also der Funktionskopf aussehen, damit ich im Aufruf eine Lambda Expression in die Parameterliste eintragen kann?</p>
<p>Danke!</p>
<p>Grüße,<br />
Hendrik</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286839/lambda-an-funktion-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 17:29:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286839.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 May 2011 12:08:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lambda an Funktion übergeben on Tue, 17 May 2011 12:08:30 GMT]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>ich fange gerade an, C++0x zu verstehen. Nun versuche ich, eine Funktion zu schreiben, an die ich per Parameter eine Lambda Expression übergeben kann.</p>
<p>Wie muss also der Funktionskopf aussehen, damit ich im Aufruf eine Lambda Expression in die Parameterliste eintragen kann?</p>
<p>Danke!</p>
<p>Grüße,<br />
Hendrik</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064592</guid><dc:creator><![CDATA[SeveQ]]></dc:creator><pubDate>Tue, 17 May 2011 12:08:30 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda an Funktion übergeben on Tue, 17 May 2011 12:13:51 GMT]]></title><description><![CDATA[<p>ha^^</p>
<p>dafür würd ich erstmal gern wissen was lambda funktionen sind und wofür sie da sind... <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/2064599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064599</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 17 May 2011 12:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda an Funktion übergeben on Tue, 17 May 2011 12:15:15 GMT]]></title><description><![CDATA[<p>Unbenannte Funktionen, die als Parameter benutzt werden koennen. <a href="http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions" rel="nofollow">http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064602</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 17 May 2011 12:15:15 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda an Funktion übergeben on Tue, 17 May 2011 12:27:04 GMT]]></title><description><![CDATA[<p>SeveQ schrieb:</p>
<blockquote>
<p>ich fange gerade an, C++0x zu verstehen.</p>
</blockquote>
<p>Na dann fang doch gleich schonmal mit dem neuen Namen an: C++11 bzw C++2011. <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>
<p>SeveQ schrieb:</p>
<blockquote>
<p>Nun versuche ich, eine Funktion zu schreiben, an die ich per Parameter eine Lambda Expression übergeben kann.</p>
<p>Wie muss also der Funktionskopf aussehen, damit ich im Aufruf eine Lambda Expression in die Parameterliste eintragen kann?</p>
</blockquote>
<p>Ein Lambda-Ausdruck liefert ein &quot;Funktions-Objekt&quot; eines <em>einzigartigen</em> Typs (jeder Lambda-Ausdruck hat seinen eigenen Typ!), der keinen Namen hat. Ein &quot;Funktions-Objekt&quot; ist ein Objekt eines Typs, für den der Funktions-Aufruf-Operator definiert ist. Da so ein Typ keinen Namen hat, kannst Du den natürlich auch nicht direkt in einer Funktionsdeklaration verwendet.</p>
<p>Möglichkeit 1: Einen Wrapper verwenden</p>
<pre><code class="language-cpp">void foo(function&lt;void()&gt; f) {
  f();
}

int main() {
  foo([]{
    cout&lt;&lt;&quot;Hello!&quot;&lt;&lt;endl;
  });
}
</code></pre>
<p>Möglichkeit 2: Aus der Funktion ein Template machen:</p>
<pre><code class="language-cpp">template&lt;class FunObjType&gt;
void foo(FunObjType f) {
  f();
}

int main() {
  foo([]{
    cout&lt;&lt;&quot;Hello!&quot;&lt;&lt;endl;
  });
}
</code></pre>
<p>wobei das function&lt;&gt;-Template aus dem std-Namensraum kommt und über den &lt;functional&gt;-Header verfügbar sein müsste. Stimmt die Signatur überein, kann ein Funktionsobjekt zu einem function&lt;?&gt;-Objekt implizit konvertiert werden. Hier ist aber mit etwas Overhead zu rechnen.</p>
<p>Lokal halten lässt sich ein Lambda-Objekt auch mit auto:</p>
<pre><code class="language-cpp">int main() {
  auto lamobj = []{
    cout&lt;&lt;&quot;Hello!&quot;&lt;&lt;endl;
  };
  foo(lamobj);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2064605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064605</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 17 May 2011 12:27:04 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda an Funktion übergeben on Tue, 17 May 2011 13:24:13 GMT]]></title><description><![CDATA[<p>Es gibt noch <s>zwei</s> eine weitere Möglichkeiten:</p>
<p>1. Funktionszeiger. Jede Lambda-Funktion lässt sich laut Standard in einen Funktionszeiger der entsprechenden Signatur konvertieren.</p>
<p><s>2. decltype</s></p>
<pre><code class="language-cpp">[s]void f(decltype([](){return 42;}) x);[/s]
</code></pre>
<p><s>Ein bisschen witzlos, weil man nur genau diese eine Lambda-Funktion übergeben kann, der Vollständigkeit wegen wollte ich es aber erwähnen.</s></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064630</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Tue, 17 May 2011 13:24:13 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda an Funktion übergeben on Tue, 17 May 2011 13:13:12 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>1. Funktionszeiger. Jede Lambda-Funktion lässt sich laut Standard in einen Funktionszeiger der entsprechenden Signatur konvertieren.</p>
</blockquote>
<p>Also das halte ich einfach mal für falsch. Ich kann mich hier schwach an eine Diskussion erinnern, bei der schließlich herausgekommen ist, dass dies nur für eine void(*)() gilt, oder so ähnlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064658</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 17 May 2011 13:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda an Funktion übergeben on Tue, 17 May 2011 13:22:50 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>ipsec schrieb:</p>
<blockquote>
<p>1. Funktionszeiger. Jede Lambda-Funktion lässt sich laut Standard in einen Funktionszeiger der entsprechenden Signatur konvertieren.</p>
</blockquote>
<p>Also das halte ich einfach mal für falsch. Ich kann mich hier schwach an eine Diskussion erinnern, bei der schließlich herausgekommen ist, dass dies nur für eine void(*)() gilt, oder so ähnlich.</p>
</blockquote>
<p>Zum Glück ist der Draft frei verfügbar: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf</a></p>
<p>5.1.2.6 schrieb:</p>
<blockquote>
<p>The closure type for a lambda-expression with no lambda-capture has a public non-virtual non-explicit const<br />
conversion function to pointer to function having the same parameter and return types as the closure type’s<br />
function call operator. The value returned by this conversion function shall be the address of a function<br />
that, when invoked, has the same effect as invoking the closure type’s function call operator.</p>
</blockquote>
<p>Also bei jeder Lambda mit leerer Capture-Clause.<br />
Nebenbei steht etwas weiter oben, dass meine Variante mit decltype doch nicht geht, da der Typ der Lambda-Funktion auf den kleinsten umgebenden Scope beschränkt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064665</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Tue, 17 May 2011 13:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda an Funktion übergeben on Tue, 17 May 2011 13:35:00 GMT]]></title><description><![CDATA[<p>Achja richtig, ohne Capturing, das wars.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064686</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 17 May 2011 13:35:00 GMT</pubDate></item></channel></rss>