Speichern von Mitgliedsfunktionszeigern in generischen std::function-Objekten
Beim Versuch, Mitgliedsfunktionszeiger einer bestimmten Klasse in einer Karte mit zu speichern std::function-Objekte, Entwickler können auf einen Fehler stoßen: „Term wird nicht als Funktion mit 0 Argumenten ausgewertet.“ Dieser Fehler tritt auf, wenn der Member-Funktionszeiger direkt dem std::function-Objekt zugewiesen wird.
Der Kern des Problems liegt in der Tatsache, dass nicht statische Member-Funktionen einen impliziten „this“-Zeiger als erstes Argument erfordern . Um dies zu beheben, muss das erste Argument explizit gebunden werden.
Lösung:
std::function<void(void)> f = std::bind(&Foo::doSomething, this);
Dieser Ansatz bindet effektiv den „this“-Zeiger als erstes Argument und ermöglicht so das std::function-Objekt, um die Mitgliedsfunktion korrekt zu erfassen.
Handhabung von Funktionen mit Parameter:
Für Memberfunktionen mit Parametern müssen Platzhalter angegeben werden, um die Position der gebundenen Argumente anzugeben.
using namespace std::placeholders; std::function<void(int, int)> f = std::bind(&Foo::doSomethingArgs, this, std::placeholders::_1, std::placeholders::_2);
C 11 Lambda-Syntax:
Wenn der Compiler C 11-Lambdas unterstützt, kann ein prägnanterer Ansatz sein genutzt:
std::function<void(int, int)> f = [=](int a, int b) { this->doSomethingArgs(a, b); };
Durch die Befolgung dieser Techniken können Entwickler Mitgliedsfunktionszeiger mithilfe generischer std::function-Objekte effektiv speichern und aufrufen.
Das obige ist der detaillierte Inhalt vonWie speichere ich Mitgliedsfunktionszeiger in generischen „std::function'-Objekten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!