Bonjour à tous et toutes,
Je suis en train de me faire un petit gestionnaire d'évènements en ce moment et j'ai un petit problème avec les pointeurs sur fonction (en faite après ça sera avec des fonctions membres mais restons simple pour commencer).
En gros certains objets possèdent un container d'events, un event est un objet générique décrivant un évènement, pour résumer c'est une structure avec une clé contenant le type de l'évent (resize, mousemove etc.) et la fonction a exécuter quand l'event est détecté.
Le problème étant que je stocke cette fonction dans un vilain void*, ce qui n'est vraiment pas safe selon cette référence : http://www.parashift.com/c++-faq-lit...html#faq-33.10
Le truc sait que je sais qu'elle tête à ma fonction au moment ou je créé un event et au moment ou je l'appelle vu que je lui passe des paramètres (et selon ces paramètres je cast mon void* pour faire un appel correcte). Le problème est que je ne peux pas templater mon event car dans ce cas je ne peux stocker mes différents events dans un container générique.
Voilà un peu de code pour vous faire comprendre parce que je sens que mon explication est vraiment pourri :D :
Pour ajouter un event (en fait l'action correspondante) je fais comme ceci :
Pour appeler l'action, comme cela :Code:myEventActions[Event::RESIZE] = Event(Event::RESIZE, func_resized);
Et ma classe Event :Code:myEventActions[Event::RESIZE].process(vec2(400.0f, 400.0f));
Auriez-vous une idée pour que je puisse stocker mon pointeur de fonction d'une façon "valide" et safe ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 class Event { public: enum Type { NOTHING = 0, RESIZE, NUMBER }; long myType; void* myFunc; Event(long type, void* func) : myType(type), myFunc(func) { } template<class T> void process(const T& parameters); }; template<> inline void Event::process<vec2>(const vec2& parameters) { switch(myType) { default: Log::Instance().writeEndl("Parameters do not match !"); break; case RESIZE: Log::Instance().writeEndl("Resize event called !"); void (*func) (const vec2&) = (void (*) (const vec2&)) myFunc; func(parameters); break; } }