La question d'origine visait à créer un mécanisme générique d'événement qui fonctionnerait de manière cohérente sur différentes classes. Au lieu de s'appuyer sur des méthodes statiques et de passer autour des pointeurs d'instance de classe, une approche C plus moderne peut être utilisée à l'aide de std :: function et std :: bind.
La classe de gestionnaire d'événements accepte désormais un objet de fonction std :: comme argument. Un objet de fonction représente une entité appelable qui peut être transmise comme un pointeur de fonction ordinaire. La méthode du gestionnaire d'événements AddHandler prend une fonction std :: VOID (int)> comme un argument, où la fonction passée n'a pas de valeur de retour et prend un entier comme argument.
class EventHandler { public: void addHandler(std::functioncallback) { cout liant des fonctions spécifiques
pour lier une méthode de classe spécifique au gestionnaire d'événements, std :: bind est utilisé. std :: bind spécifie le pointeur et la fonction à appeler lorsque l'événement est déclenché.
class MyClass { public: MyClass(); // Note: No longer marked `static`, and only takes the actual argument void Callback(int x); private: int private_x; }; MyClass::MyClass() { using namespace std::placeholders; // for `_1` private_x = 5; handler->addHandler(std::bind(&MyClass::Callback, this, _1)); } void MyClass::Callback(int x) { // No longer needs an explicit `instance` argument, // as `this` is set up properly coutfonctions autonomes et fonctions lambda
Si le rappel est une fonction indépendante sans contexte de classe, std :: bind n'est pas obligatoire.
void freeStandingCallback(int x) { // ... } int main() { // ... handler->addHandler(freeStandingCallback); }For anonymous callbacks, lambda functions can be used with the event handler.
handler->addHandler([](int x) { std::coutIn this way, using std::function and std::bind provides a flexible and Solution générique pour les rappels qui peuvent être appliqués à différentes classes et fonctions.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3