Je suis entrain de tenter de faire un mécanisme d'évènements. Le but est de pouvoir attacher des fonctions membres de n'importe quels objets qui sont appelées lorsque les évènements se déclenchent.
La première classe permet d'appeler la fonction membre en question, via le pointeur sur l'objet concerné, elle dérive d'une interface afin de faire disparaître le paramètre template relatif au type de cet objet extérieur dans la seconde classe
La seconde classe, dont dérive l'objet emetteur d'évènements :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 template< typename Ret, typename Args > class SubscriberInterface { public: virtual Ret operator()( Args args ) = 0; }; template< class T, typename Ret, typename Args > class Subscriber : public SubscriberInterface< Ret, Args > { public: typedef Ret( T::*ObjectMethod )( Args ); Subscriber( ObjectMethod f, T* t ) : mpT( t ), mpF( f ) {}; Ret operator()( Args args ) { return( mpT->*mpF )( args ); } private: T* mpT; ObjectMethod mpF; };
Dans la pratique, si le pointeur de la fonction et l'instance lors de l'appel à SubscribeEvent sont bons, à l'intérieur ils sont à 0 (et pas du même type d'après le débugger). Au final, la méthode censée être appelé lors de l'évènement ne l'est jamais, quelque chose est appelé pourtant, mais le code n'est pas visible. Ca ne plante jamais...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
44
45
46
47
48 template< typename Ret, typename Args > class Subscribed { public: template< class T > void SubscribeEvent( ULONG ulEvent, Ret( T::*f )( Args ), T* t ) { mmapSubscribers[ new Subscriber< T, Ret, Args >( f, t ) ] = ulEvent; } void UnSubscribeEvent( ULONG ulEvent ) { for( SubscriberMap::iterator itSubscribers = mmapSubscribers.begin(); itSubscribers != mmapSubscribers.end(); ) { if( itSubscribers->second == ulEvent ) { SubscriberInterface< Ret, Args >* psubscriber( itSubscribers->first ); itSubscribers = mmapSubscribers.erase( itSubscribers ); delete psubscriber; } else { ++itSubscribers; } } } void FireEvent( ULONG ulEvent, Args& args ) { for( std::map< SubscriberInterface<Ret,Args>*,ULONG >::iterator itSubscribers = mmapSubscribers.begin(); itSubscribers != mmapSubscribers.end(); ++itSubscribers ) { if( itSubscribers->second == ulEvent ) { ( *itSubscribers->first )( args ); } } } private: std::map< SubscriberInterface<Ret,Args>*,ULONG > mmapSubscribers; };
Voilà j'ai un peu écumé le net, il semblerait que je n'ai pas fait d'erreurs de conception, mais je me trompe sans doute, donc si quelqu'un pouvait m'éclairer un coup, j'y vois rien du tout
Merci.
Partager