Vergleich und Kontrast: std::bind und Lambdas in C 0x
In C 0x stehen Programmierern zwei Optionen zum Erfassen von a gegenüber Funktion: std::bind und Lambdas. Obwohl beide unterschiedliche Zwecke erfüllen, überschneiden sie sich in einigen Anwendungen. Lassen Sie uns die Stärken und Grenzen jedes Ansatzes untersuchen, indem wir ein Beispiel für sich überschneidende Funktionalität nehmen.
Betrachten Sie die Aufgabe, eine Würfelwurffunktion zu erstellen. Mit Lambda können wir dies wie folgt ausdrücken:
<code class="cpp">auto dice = [&]() { return distribution(engine); };</code>
Alternativ können wir mit std::bind schreiben:
<code class="cpp">auto dice = bind(distribution, engine);</code>
Monomorph vs. Polymorphic
Ein grundlegender Unterschied liegt in ihrem Typverhalten. Lambdas sind monomorph, das heißt, sie haben feste Argumenttypen, die zur Kompilierzeit festgelegt werden. Diese Einschränkung schränkt die Flexibilität von Lambdas im Vergleich zu ihren Bindungsgegenstücken ein.
Stellen Sie sich zum Beispiel eine Funktion vor, die zwei Argumente ausgibt:
<code class="cpp">auto f = [](auto a, auto b) { cout << a << ' ' << b; }
Die Verwendung dieses Lambda mit unterschiedlichen Parametertypen führt zu einem Compilerfehler. Im Gegensatz dazu ermöglicht std::bind polymorphes Verhalten, wodurch die Funktion an Argumente unterschiedlicher Typen gebunden werden kann:
<code class="cpp">struct foo { template <typename A, typename B> void operator()(A a, B b) { cout << a << ' ' << b; } }; auto f = bind(foo(), _1, _2);</code>
Durch das Aufschieben der Typableitung bis zum Aufruf der Funktion bietet std::bind eine größere Flexibilität für den Umgang mit verschiedenen Eingabetypen.
Das obige ist der detaillierte Inhalt vonWann sollte man wählen: std::bind vs. Lambdas in C 0x?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!