Callback resolu à la compilation...

Callback resolu à la compilation... - C++ - Programmation

Marsh Posté le 26-12-2004 à 11:50:58    

Je souhaiterais faire une classe de base callback optimisée utilisable dans tout programme présentant la particularité de lier evennements et traitements de manière statique (définie à la commpilation). Les classes callback et slot que je trouve sur le net sont toutes "dynamiques" (callback modifiable pendant l'exécution). Sauf erreur de ma part, ces solutions sont sans doute lourdes à l'excution si l'on n'a pas besoin de l'aspect dynamique.
 
Dans le code, voila l'idée : le calbback est paramétré à la compilation avec l'objet de traitement, la fonction membre de traitement et l'ensemble des types adequates.

Code :
  1. template< class t_callback_class,
  2.   typename t_return,
  3.   typename t_argument,
  4.   t_return (t_callback_class::*fm)( t_argument ) >
  5. struct C
  6. {
  7. // constructeur
  8. C( t_callback_class& c ) :
  9. _callback_class( c )
  10. {
  11. }
  12. // fonction callback
  13. inline t_return operator()( t_argument arg )
  14. {
  15.  (_callback_class.*fm)( arg );
  16. };
  17. private:
  18. t_callback_class& _callback_class;
  19. };


 
A l'utilisation, cela donne quelquechose du genre :

Code :
  1. struct A
  2. {
  3. A( const string& m ) :
  4. _message( m )
  5. {
  6. }
  7. void traitement( const string& s )
  8. {
  9.  cout << _message << "traitement(" << s << " )" << endl;
  10. }
  11. private:
  12. string _message;
  13. };
  14. struct X : C< A, void, const string&, &A::traitement >
  15. {
  16. X() :
  17. C< A, void, const string&, &A::traitement >( a ),
  18. a( "Instance de X :" )
  19. {
  20. }
  21. void event()
  22. {
  23.  (*this)( "event depuis X!" );
  24. }
  25. private:
  26. A a;
  27. };
  28. struct Y
  29. {
  30. Y() :
  31. a( "Instance de Y :" ),
  32. c( a )
  33. {
  34. }
  35. void event()
  36. {
  37.  c( "event depuis Y!" );
  38. }
  39. private:
  40. A a;
  41. C< A, void, const string&, &A::traitement > c;
  42. };
  43. struct Z
  44. {
  45. Z( A& a ) :
  46. c( a )
  47. {
  48. }
  49. void event()
  50. {
  51.  c( "event depuis Z!" );
  52. }
  53. private:
  54. C< A, void, const string&, &A::traitement > c;
  55. };
  56. int main()
  57. {
  58. X x;
  59. Y y;
  60. A a( "Instance globale :" );
  61. Z z1( a ), z2( a );
  62. x.event();
  63. y.event();
  64. z1.event();
  65. z2.event();
  66. }


 
Pensez vous que cela apporte réellement une optimisation par rapport à un callback "dynamique" ?
 
Toutes remarques sont les bienvenues aussi bien sur la démarche que l'implémentation.
 
-edit : L'objet de traitement est passé à la classe de base callback par référence (copie possible). L'idée est de laisser construire l'objet de traitement par l'utilisateur de la classe callback..


Message édité par xterminhate le 26-12-2004 à 14:59:03

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 26-12-2004 à 11:50:58   

Reply

Marsh Posté le 26-12-2004 à 13:29:09    

Citation :


Pensez vous que cela apporte réellement une optimisation par rapport à un callback "dynamique" ?


 
 
Pour ce qui'est de l'optimisation, (niveau execution OUI)  car là avec ton'template', le code de tes fonctions génériques sera copié à la compilation à chaque appel et pour chaque 'type de donnée' utilisés.
 
En gros cela revient à écrire chaques fonctions à la main (elles sont connues  vu que rien ne doit se passer dynamiquement).
 
 
 

Citation :

Toutes remarques sont les bienvenues aussi bien sur la démarche que l'implémentation.


 
 
... struct X : C< .... void event() { callback( "event depuis Y" ); } ..
 
As tu pensé aux exceptions ? (elles ne sont pas reservées exclusivement à lever 'une erreur'   ;)
 
 
sinon très bon code et bien refléchi   :sum:
 
a+

Reply

Marsh Posté le 27-12-2004 à 12:56:54    

Merci.
 

ouned-coding a écrit :

As tu pensé aux exceptions ? (elles ne sont pas reservées exclusivement à lever 'une erreur'   ;)


 
Justement, non. Que puis-je faire pour améliorer les choses ?


Message édité par xterminhate le 27-12-2004 à 12:57:23

---------------
Cordialement, Xterm-in'Hate...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed