"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment implémenter des rappels génériques C ++ à l'aide de membres de la classe et de `std :: function`?

Comment implémenter des rappels génériques C ++ à l'aide de membres de la classe et de `std :: function`?

Publié le 2025-03-22
Parcourir:189

How to Implement Generic C   Callbacks Using Class Members and `std::function`?

C fallback Utilisation d'un membre de la classe avec implémentation générique

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.

le gestionnaire d'événements avec std :: function

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::function callback)
    {
        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
    cout  

fonctions 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::cout 

In 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.

Dernier tutoriel Plus>

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