J'ai trouvé ce code pour le gestionnaire d'événements avec le style d'enregistrement en c++. Quelqu'un peut-il m'expliquer, à quoi sert le code ci-dessous?

#include <algorithm>
#include <functional>
#include <list>

class Button {

    public:
        typedef void (*OnPress)(Button *, void *closure);
    
    private:
        typedef std::pair<OnPress, void*> PressCallBack;
        std::list<PressCallBack> onPress;

        struct Notify:
        public std::binary_function<PressCallBack, Button*, void> {
            void operator()( PressCallBack& c, Button* b) const {
                (*c.first)(b, c.second);
            }
        };

        void NotifyAll(void){
            std::for_each(
                onPress.begin(), onPress.end(),
                std::bind2nd(Notify(), this)
            );
        }

    public:
        void AddOnButtonPress(OnPress f, void *c){
            onPress.push_back(PressCallBack(f,c));
        }

        void RemoveOnButtonPress(OnPress f, void *c){
            onPress.remove(PressCallBack(f,c));
        }
};

Tout commentaire sera utile !!! Merci d'avance!

0
Manolis P. 8 sept. 2020 à 03:02

1 réponse

Meilleure réponse

Quelque part il y a des fonctions avec la signature :

 void function_name(Button* btn, void* ptrToSomeData);

Les fonctions avec le deuxième paramètre (ptrToSomeData) peuvent être ajoutées dans la liste des gestionnaires d'événements avec la fonction Button::AddOnButtonPress :

 Button::AddOnButtonPress(function_name, &SomeData);

Lorsque la fonction Button::NotifyAll() est appelée pour un objet SomeButton, alors toutes les fonctions ajoutées seront appelées dans l'ordre dans lequel elles ont été ajoutées. Le premier argument recevra un pointeur vers le bouton (SomeButton), et le deuxième argument sera celui spécifié lors de l'ajout.

typedef void (*OnPress)(Button *, void *closure);
//< declare OnPress as pointer to function (pointer to Button, pointer to void) returning void

typedef std::pair<OnPress, void*> PressCallBack;
//< declare pair of 
//< - pointer to function (pointer to Button, pointer to void) returning void
//    and
//< - pointer to void
//This type is used to store the pointer to callback function with the second argument of the function

std::list<PressCallBack> onPress; //< list of saved callbacks

struct Notify:
public std::binary_function<PressCallBack, Button*, void> {
    void operator()( PressCallBack& c, Button* b) const {
          (*c.first)(b, c.second);
    }
};
//< the type Notify - it is functor. It is used this way: 
//  Notify()(callback, this);
//  so
//  it calls callback_function(this, store_pointer_to_some_data)

void NotifyAll(void){
    std::for_each(
        onPress.begin(), onPress.end(),
          std::bind2nd(Notify(), this)
     );
}
//< for every stored callback:
//   1) create object Notify
//   2) call Notify::operator()(PressCallBack, this)

void AddOnButtonPress(OnPress f, void *c){
    onPress.push_back(PressCallBack(f,c));
}
//< store callback function 'f' and second argument 'c' for the callback function 'f' into onPress list

    void RemoveOnButtonPress(OnPress f, void *c){
        onPress.remove(PressCallBack(f,c));
    }
//< store callback function 'f' with the second argument 'c' from onPress list
1
B0FEE664 9 sept. 2020 à 16:28