Maison > développement back-end > C++ > Comment C peut-il obtenir des mécanismes de rappel flexibles sans s'appuyer sur les fonctions membres de la classe ?

Comment C peut-il obtenir des mécanismes de rappel flexibles sans s'appuyer sur les fonctions membres de la classe ?

Linda Hamilton
Libérer: 2024-12-30 08:20:10
original
719 Les gens l'ont consulté

How Can C   Achieve Flexible Callback Mechanisms Without Relying on Class Member Functions?

Mécanismes de rappel en C sans fonctions membres de classe

Les fonctions de rappel fournissent un moyen d'enregistrer une fonction à invoquer lorsqu'un événement spécifique se produit. Bien que l'utilisation de méthodes statiques et la transmission d'instances de classe en tant que paramètres soient une approche courante, cela limite la flexibilité d'utilisation des rappels entre différentes classes.

std::function et std::bind en C 11 et au-delà

C 11 a introduit std::function, un wrapper de type sécurisé pour les pointeurs de fonction. Cela permet aux rappels d'être stockés en tant qu'objets, indépendamment de la classe à laquelle ils font référence. De plus, std::bind est utilisé pour lier une fonction à un objet spécifique et à ses arguments.

Considérons un exemple de classe de gestionnaire d'événements, EventHandler :

class EventHandler {
public:
    void addHandler(std::function<void(int)> callback) {
        cout << "Handler added..." << endl;
        callback(1); // trigger the event
    }
};
Copier après la connexion

Maintenant, MyClass et YourClass peuvent tous deux utiliser ce gestionnaire d'événements en implémentant leurs propres fonctions de rappel et en les enregistrant à l'aide de std::bind:

class MyClass {
public:
    MyClass() {
        private_x = 5;
        handler->addHandler(std::bind(&MyClass::Callback, this, _1));
    }
private:
    int private_x;

    void Callback(int x) {
        cout << x + private_x << endl;
    }
};

class YourClass {
public:
    YourClass() {
        handler->addHandler(std::bind(&YourClass::Callback, this, _1));
    }
private:
    void Callback(int x) {
        // Do something with x
    }
};
Copier après la connexion

Fonctions Lambda et EventHandler

De plus, C 11 a introduit les fonctions lambda, fournissant un moyen concis et simple de définir des fonctions anonymes. Ils peuvent être utilisés avec des gestionnaires d'événements pour créer des rappels hautement personnalisables :

handler->addHandler([](int x) {
    cout << "Lambda callback executed with x: " << x << endl;
});
Copier après la connexion

Cela permet une plus grande flexibilité dans la définition des rappels et leur découplage des méthodes de classe spécifiques.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal