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 RefactorEventHandler zum Akzeptieren von std::function:
class EventHandler { public: void addHandler(std::function<void(int)> callback) { // ... (as above) } };
MyClass anpassen
ÄndernMyClass, 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) }
Callback an den zu binden EventHandler, verwenden std::bind:
handler->addHandler(std::bind(&MyClass::Callback, this, std::placeholders::_1));
_1 stellt das einzelne Argument dar.
Eigenständige Funktionen und Lambda-Ausdrücke
Sie können eigenständige Funktionen direkt in verwendenaddHandler:
void freeStandingCallback(int x) { // ... } handler->addHandler(freeStandingCallback);
addHandler verwendet werden:
handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; });
Fazit
Durch Beschäftigungstd::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!