Transmission de rappels entre classes hétérogènes
En C, définir des rappels qui peuvent être partagés entre différentes classes peut poser un défi. Bien que fournir une fonction membre statique et transmettre un pointeur vers l’instance de classe soit une approche courante, cela limite la flexibilité. Voici comment résoudre ce problème à l'aide des std::function et std::bind:
Refactoring EventHandler
Au lieu de méthodes statiques et de pointeurs d'instance, refactorisez EventHandler pour accepter std::function:
class EventHandler { public: void addHandler(std::function<void(int)> callback) { // ... (as above) } };
Cette fonction accepte un "objet fonction" qui prend un argument entier et ne renvoie rien.
Adapter MyClass
Modifier MyClass pour supprimer le mot-clé statique de Callback et fournir un argument à la place :
class MyClass { public: void Callback(int x); // ... }; MyClass::Callback(int x) { // ... (as above) }
Pour lier le Callback au EventHandler, utilisez std::bind:
handler->addHandler(std::bind(&MyClass::Callback, this, std::placeholders::_1));
L'espace réservé _1 représente l'argument unique.
Fonctions autonomes et expressions Lambda
Vous pouvez utiliser des fonctions autonomes directement dans addHandler :
void freeStandingCallback(int x) { // ... } handler->addHandler(freeStandingCallback);
De plus, les expressions lambda C 11 peuvent être utilisées dans addHandler :
handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; });
Conclusion
En employant std::function et std::bind, les rappels peuvent être transmis de manière transparente entre des classes hétérogènes, offrant flexibilité et réutilisabilité du code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!