Je travaille donc sur cette classe de gestion d'événements. Je stocke une liste de pointeurs vers les fonctions membres de la signature void (Event*)
où Event est juste une structure qui stocke des données aléatoires pour le moment.Membre Fonction Pointeur avec argument de classe de base acceptant l'argument de classe dérivée
typedef boost::function<void(Event*)> Callback;
typedef vector<Callback> CallbackList;
class EventManager
{
public:
template<typename T>
void RegisterEventHandler(const std::string& type, void (T::*handler)(Event*), T* obj)
{
mCallbackList[type].push_back(boost::bind(handler, obj, _1));
}
void DispatchEvent(const std::string& type, Event* evt)
{
for(CallbackList::iterator it = mCallbackList[type].begin(); it != mCallbackList[type].end(); ++it)
{
Callback callback = (*it);
callback(evt);
}
}
private:
hash_map<std::string, CallbackList> mCallbackList;
};
Je me demande s'il est possible pour moi de tirer différentes versions de l'événement, et passer des pointeurs vers les fonctions membres dans cette catégorie? Actuellement j'essaye ceci.
class MouseEvent : public Event
{
public:
int testMouseData1;
int testMouseData2;
int testMouseData3;
};
class HelloWorld
{
public:
void Display(MouseEvent* evt)
{
cout << "Hello, world!" << endl;
}
};
int main(void)
{
MouseEvent* evt = new MouseEvent();
HelloWorld* world = new HelloWorld();
eventManager->RegisterEventHandler("testType", &HelloWorld::Display, world);
return 0;
}
Cela me donne l'erreur suivante dans XCode. Savez-vous comment transmettre en toute sécurité un pointeur qui attend une classe dérivée dans sa signature de fonction? Merci.
@Harley - Les fonctions modèle ont inférence de type, donc je dirais que la façon dont il appelle RegisterEventHandler est paramètres OK de modèle de fonction – Manuel
peuvent être déduites des arguments de la fonction, néanmoins spécifiant explicitement le type de modèle aiderait op déterminer pourquoi instanciation n'a – Anycorn
Convenu , essayant juste d'éliminer toutes les variables ici. Assez sûr que le point principal @Morgan doit regarder ici est le type "Event" vs "MouseEvent". –