Heim > Backend-Entwicklung > C++ > Wie speichere ich Mitgliedsfunktionszeiger korrekt in einer „std::function'-Map?

Wie speichere ich Mitgliedsfunktionszeiger korrekt in einer „std::function'-Map?

Linda Hamilton
Freigeben: 2024-12-21 01:00:10
Original
522 Leute haben es durchsucht

How to Correctly Store Member Function Pointers in a `std::function` Map?

Speichern von Mitgliedsfunktionszeigern in std::function Map für eine einzelne Klasse

Beim Versuch, Funktionszeiger auf Mitgliedsfunktionen einer bestimmten Klasse zu speichern Wenn Sie eine Klasse in einer std::function-Map verwenden, ist es wichtig, die Anforderungen zu verstehen, die erforderlich sind, damit eine nicht statische Memberfunktion mit einer aufgerufen werden kann Objekt.

Im bereitgestellten Code ist der Fehler auf die falsche Funktionssignatur von std::function zurückzuführen. Da nicht-statische Memberfunktionen „this“ immer als implizites Argument übergeben, sollte die Signatur so geändert werden, dass sie das Objekt als ersten Parameter enthält.

Der korrigierte Codeausschnitt wäre:

#include <functional>

class Foo {
public:
    void doSomething() {}
    void bindFunction() {
        // Correct
        std::function<void(Foo*)> f = &Foo::doSomething;
    }
};
Nach dem Login kopieren

Um eine Funktion weiter mit Parametern zu verknüpfen, können C-Platzhalter oder C 11-Lambdas verwendet werden. Hier sind Beispiele für diese Ansätze:

Verwendung von Platzhaltern:

using namespace std::placeholders;
std::function<void(Foo*, int, int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2);
Nach dem Login kopieren

Verwendung von Lambdas (C 11):

std::function<void(Foo*, int, int)> f = [=](Foo* foo, int a, int b) {
    foo->doSomethingArgs(a, b);
};
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie speichere ich Mitgliedsfunktionszeiger korrekt in einer „std::function'-Map?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage