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
Freigeben: 2024-12-15 22:18:17
Original
621 Leute haben es durchsucht

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)
    }
};
Nach dem Login kopieren
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)
}
Nach dem Login kopieren
Um den

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

handler->addHandler(std::bind(&MyClass::Callback, this, std::placeholders::_1));
Nach dem Login kopieren
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);
Nach dem Login kopieren
Zusätzlich können C 11-Lambda-Ausdrücke innerhalb von

addHandler verwendet werden:

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

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!

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