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 zu einer Funktion ausgewertet, die 0 Argumente akzeptiert.“ 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::functionf = std::bind(&Foo::doSomething, this);
Dieser Ansatz bindet effektiv den „this“-Zeiger als erstes Argument, sodass das std::function-Objekt das korrekt erfassen kann Mitgliedsfunktion.
Verarbeiten von Funktionen mit Parametern:
Für Mitgliedsfunktionen mit Parametern müssen Platzhalter angegeben werden, um die Position der gebundenen Argumente anzugeben.
using namespace std::placeholders; std::functionf = 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 verwendet werden:
std::functionf = [=](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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3