Heim >Backend-Entwicklung >C++ >Wie binde ich C-Memberfunktionen korrekt an std::function-Objekte?
Mitgliedsfunktionen an generische std::function-Objekte binden
In C kann es vorkommen, dass Sie Funktionszeiger auf Mitglieder speichern müssen Funktionen einer bestimmten Klasse in einem Container, der std::function-Objekte akzeptiert. Der Versuch, eine nicht statische Mitgliedsfunktion direkt an eine std::function zu binden, kann jedoch zu Fehlern führen.
Beachten Sie den folgenden Code:
#include <functional> class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } };
Dieser Code führt zu einem Compiler Fehler, da nicht statische Memberfunktionen implizit einen „this“-Zeiger als erstes Argument akzeptieren. Um dieses Problem zu beheben, müssen Sie das Objekt im Voraus mit der Funktion std::bind binden.
std::function<void(void)> f = std::bind(&Foo::doSomething, this);
Diese Version bindet den Zeiger „this“ korrekt an die Mitgliedsfunktion, sodass Sie ihn darin speichern können das std::function-Objekt, ohne den Fehler auszulösen.
Für Mitgliedsfunktionen, die Parameter akzeptieren, können Sie std::placeholders verwenden, um sie anzugeben Positionen:
using namespace std::placeholders; std::function<void(int,int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2);
Wenn Ihr Compiler alternativ C 11-Lambdas unterstützt, können Sie diese verwenden, um das std::function-Objekt zu erstellen:
std::function<void(int,int)> f = [=](int a, int b) { this->doSomethingArgs(a, b); }
Durch die Verwendung dieser Techniken können Sie dies tun Binden Sie Mitgliedsfunktionen effektiv an generische std::function-Objekte, sodass Sie sie bequem speichern und bearbeiten können.
Das obige ist der detaillierte Inhalt vonWie binde ich C-Memberfunktionen korrekt an std::function-Objekte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!