std::function und std::bind: was sind Sie, und Wann sollte Sie eingesetzt werden?
Ich weiß, was funktoren sind und Wann Sie zu verwenden mit std
algorithmen, aber ich habe nicht verstanden, was Stroustrup über Sie sagt in der C++11-FAQ.
Kann mir jemand erklären, was std::bind
und std::function
sind, wenn Sie verwendet werden soll, und geben einige Beispiele für newbies?
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::bind
ist für partielle Funktion, Anwendung.Ist, angenommen, Sie haben ein function-Objekt
f
dauert 3 Argumente:Du willst ein neues function-Objekt, das dauert nur zwei Argumente, definiert als:
g
ist eine "partielle Anwendung" der Funktionf
: der mittlere argument hat bereits angegeben, und es sind zwei Links zu gehen.Können Sie
std::bind
zu bekommeng
:Dies ist präziser als mit dem eigentlichen schreiben einen Funktor Klasse zu tun.
Gibt es weitere Beispiele in dem Artikel, den Sie verlinken. In der Regel setzen Sie es, wenn Sie brauchen, um passieren eine Funktor in einigen Algorithmus. Sie haben eine Funktion oder Funktor, dass fast macht die Arbeit, die Sie wollen, aber mehr konfigurierbar (d.h. mehr Parameter hat) als der des-Algorithmus verwendet. So binden Sie die Argumente für einige der Parameter, und lassen den rest der Algorithmus zum füllen:
Hier
pow
nimmt zwei Parameter und können zu erhöhen, um alle macht, aber alles, was wir interessiert, ist die Sensibilisierung für die macht der 7.Als eine gelegentliche Verwendung, die nicht partielle Funktion Anwendung
bind
können auch die Reihenfolge der Argumente einer Funktion:Ich nicht empfehlen es zu benutzen, nur weil Sie nicht wie die API, aber es hat das Potenzial praktisch verwendet, zum Beispiel, weil:
ist eine weniger-als-oder-gleich-Funktion (unter der Annahme einer gesamten Bestellung, bla bla). In diesem Beispiel in der Regel nicht notwendig, da es bereits eine
std::less_equal
(es verwendet die<=
Betreiber eher als<
, so dass, wenn Sie nicht konsistent sind, dann könnten Sie dies benötigen, und Sie müssen möglicherweise auch zu besuchen, der Autor der Klasse mit einem cluestick). Es ist die Art von transformation, die kommt, wenn Sie einen funktionalen Programmierstil, aber.myThread=boost::thread(boost::bind(&MyClass::threadMain, this))
std::function
?pow
Beispiel nicht kompilieren. Dapow
ist eine überladene Funktion, die Sie manuell angeben, welcher überladung. Die Bindung kann nicht abgeleitet werden, dass der Aufrufer der resultierenden Funktor. E. g.std::transform(vec.begin(), vec.end(), out.begin(), std::bind((double (*)(double, int))std::pow, _1, 7));
std::bind
kommt zusammen mit derthis
Nutzung als 2. argument. Können Sie bitte erläutern Sie diesen Anwendungsfall?std::placeholders::_1
. Ich brauchte eine Weile, um herauszufinden, warum es nicht kompilieren.std::bind gewählt wurde, in die Bibliothek, nach dem Vorschlag, der boost binden, in Erster Linie ist es die partielle Funktion Spezialisierung in denen Sie beheben können Sie einige Parameter und ändern Sie andere auf Fliegen. Nun wird diese library Weise zu tun, Lambda-Ausdrücke in C++. Wie beantwortet von Steve Jessop
Nun, dass C++11 lambda-Funktionen unterstützt, die ich nicht fühlen, jeder Versuchung zu verwenden, std::bind mehr. Ich würde eher currying (partielle Spezialisierung) mit Sprache-Funktion als library-Funktion.
std::function-Objekte sind polymorphe Funktionen. Die grundlegende Idee ist, in der Lage zu finden alle callable Objekte austauschbar.
Möchte ich Euch diese zwei links für weitere Informationen:
Lambda-Funktionen in C++11:
http://www.nullptr.me/2011/10/12/c11-lambda-having-fun-with-brackets/#.UJmXu8XA9Z8
Aufrufbare Entität in C++:
http://www.nullptr.me/2011/05/31/callable-entity/#.UJmXuMXA9Z8
std::bind
nie existiert ohne lambdas - diese beiden Funktionen wurden eingeführt, die in C++11. Wir habenbind1st
undbind2nd
waren abgemagert Versionen von C++11 zu binden.Einer der wichtigsten nutzen von std::function und std::bind ist so sicher Funktionszeiger. Sie können es verwenden, zu implementieren callback-Mechanismus. Eine der beliebtes Szenario ist, dass Sie eine Funktion zu haben, werde lange dauern, ausführen aber Sie nicht möchten, zu warten, bis Sie zurückkehren, dann können Sie diese Funktion auf einem separaten thread, und geben Sie ihm eine Funktion Zeiger, es wird Rückruf, nachdem es abgeschlossen ist.
Hier ist ein Beispiel code, wie dieses:
Habe ich es lange Zeit zurück, um ein plugin erstellen von thread-pool in C++ ; Da wurde die Funktion mit drei Parametern kann man schreiben wie diese
Angenommen, Ihre Methode hat die Signatur:
Erstellen Sie ein function-Objekt zu binden, die drei Parameter, die Sie tun können, wie diese
Nun, um das zu binden, die Parameter zu schreiben, ein binder-Funktion. So, hier geht es:
- Und eine Hilfsfunktion die Verwendung der binder3 Klasse - bind3:
und hier uns, wie wir es nennen
Hinweis: f3(); wird die Methode aufgerufen, task1->ThreeParameterTask(21,22,23);
Weitere blutige details --> http://www.codeproject.com/Articles/26078/A-C-Plug-in-ThreadPool-Design