Heim >Backend-Entwicklung >C++ >Wie können „std::function' und „std::bind' von C 11 heterogene Klassenrückrufherausforderungen lösen?

Wie können „std::function' und „std::bind' von C 11 heterogene Klassenrückrufherausforderungen lösen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-15 22:18:17696Durchsuche

How Can C  11's `std::function` and `std::bind` Solve Heterogeneous Class Callback Challenges?

Rückrufe zwischen heterogenen Klassen übergeben

In C kann die Definition von Rückrufen, die von verschiedenen Klassen gemeinsam genutzt werden können, eine Herausforderung darstellen. Die Bereitstellung einer statischen Memberfunktion und die Übergabe eines Zeigers auf die Klasseninstanz ist zwar ein gängiger Ansatz, schränkt jedoch die Flexibilität ein. Hier erfahren Sie, wie Sie dieses Problem mit C 11s std::function und std::bind:

Refactoring EventHandler

Anstelle statischer Methoden und Instanzzeiger Refactor

EventHandler zum Akzeptieren von std::function:

class EventHandler {
public:
    void addHandler(std::function<void(int)> callback) {
        // ... (as above)
    }
};
Diese Funktion akzeptiert ein „Funktionsobjekt“, das ein ganzzahliges Argument annimmt und nichts zurückgibt.

MyClass anpassen

Ändern

MyClass, um das statische Schlüsselwort aus Callback zu entfernen und stattdessen ein Argument bereitzustellen:

class MyClass {
public:
    void Callback(int x);
    // ...
};

MyClass::Callback(int x) {
    // ... (as above)
}
Um den

Callback an den zu binden EventHandler, verwenden std::bind:

handler->addHandler(std::bind(&MyClass::Callback, this, std::placeholders::_1));
Der Platzhalter

_1 stellt das einzelne Argument dar.

Eigenständige Funktionen und Lambda-Ausdrücke

Sie können eigenständige Funktionen direkt in verwenden

addHandler:

void freeStandingCallback(int x) {
    // ...
}

handler->addHandler(freeStandingCallback);
Zusätzlich können C 11-Lambda-Ausdrücke innerhalb von

addHandler verwendet werden:

handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; });

Fazit

Durch Beschäftigung

std::function und std::bind, Rückrufe können nahtlos zwischen heterogenen Klassen übergeben werden, was Flexibilität und Wiederverwendbarkeit des Codes bietet.

Das obige ist der detaillierte Inhalt vonWie können „std::function' und „std::bind' von C 11 heterogene Klassenrückrufherausforderungen lösen?. 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