Heim >Backend-Entwicklung >C++ >Wie binde ich C-Memberfunktionen korrekt an std::function-Objekte?

Wie binde ich C-Memberfunktionen korrekt an std::function-Objekte?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-19 07:53:09205Durchsuche

How to Correctly Bind C   Member Functions to std::function Objects?

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!

Stellungnahme:
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