Pointeur de fonction membre sur fonction membre de meme classe - C++ - Programmation
Marsh Posté le 31-01-2005 à 22:50:54
boot::bind est ton amie dans ce cas (c'est peut être possible directement avec la STL mais je sais pas faire)
En gros ton problème est que dans ton initialisation de d, tu ne précise pas de quel objet est issue la fonction que tu souhaite appeler. Si ça peut t'aider ton truc marcherait bien avec des fonctions statiques mais il manque le pointeur this implicite dans ton cas.
Un code utilisant boost::bind et boost::function :
Code :
|
Marsh Posté le 31-01-2005 à 23:10:15
boost, c'est génial.
Mais bon, faudrait déjà crriger l'exemple de base
(t.*(t.d))() ;
Marsh Posté le 31-01-2005 à 23:12:00
pour en revenir à l'exemple de gatorette, tout l'intérêt, c'est ensuite de pouvoir écrire
boost::function<void(void)> e = t.d;
e();
Marsh Posté le 31-01-2005 à 23:30:42
Taz a écrit : boost, c'est génial. |
Taz a écrit : |
Et juste un t.d() comme dans mon exemple ? C'est incorrect ?
Parce que sur mon compilateur (VC++ 7.1) ça compile sans problème.
Marsh Posté le 31-01-2005 à 23:39:15
c'est correcte. t.d est la fonction disp liée à l'instance t. On a ça dans plein de langage comme python par exemple. Je souligné juste que l'intérêt, c'est de pouvoir manipuler (t.d) comme un objet indépendant et en faire ce qu'on veut.
Marsh Posté le 01-02-2005 à 01:11:20
Taz a écrit : c'est correcte. t.d est la fonction disp liée à l'instance t. On a ça dans plein de langage comme python par exemple. Je souligné juste que l'intérêt, c'est de pouvoir manipuler (t.d) comme un objet indépendant et en faire ce qu'on veut. |
OK... sinon j'ai essayé de faire ça en utilisant que la STL mais je n'ai pas réussi. Voici ce que j'ai fait jusqu'à présent :
Code :
|
Deux gros problèmes :
-----------------
v2
Bon en écrivant le message j'ai réflechi un peu et voici une version qui corrige les deux problèmes évoqués ci-dessus :
Code :
|
Donc cette version fonctionne à peu près correctement. A priori le seul "petit" souci est que mon objet functor peut ne pas être initialsé (en utilisant le constructeur par défaut) et donc si on appelle la fonction ça plante misérablement. Dans un sens on peut arguer que si l'objet n'est pas initialisé c'est qu'il y a un défaut de conception mais la méthode utilisée dans boost::function (exception générée) est beaucoup plus propre et exploitable.
Bon au final je pense qu'on peut conclure que Boost est vraiment indispensable !
Marsh Posté le 01-02-2005 à 01:14:48
Bonne conclusion. <functional> c'est pas mal au sein d'expression simple, comme par exemple en argument temporaire de std::copy. Dès qu'on veut aller plus loin, ou utiliser avec des fonctions (même membres) avec des paramètres variés, const, , références, etc, c'est l'enfer. Il y a d'ailleurs des défaillances de STL là dessus. D'où http://boost.org/libs/functional/index.html
Boost::function<> est vraiment très pratique.
edit: sinon c'est très bien. C'est exactement l'approche qu'il faut avoir.
J'ai un problème. J'essaie de les résoudre avec les outils que je maîtrise déjà. Je me rends compte que mes outils ne sont pas suffisants. J'essaie de fabriquer un nouvel outil plus puissant. Je touche du doigts la technologie nécessaire à résoudre mon problème. Je ne suis pas victime du NIH. J'utilise une implémentation populaire qui a fait ses preuves. Je maîtrise un nouvel outil.
Marsh Posté le 01-02-2005 à 09:33:27
Merci a vous deux !
Merci Taz pour la correction :
Citation : (t.*(t.d))() ; |
et merci gatorette pour tes exemples explicites.
Je vais regarder cette boost d'un peu plus pres que ce que j'ai fait jusqu'a present.
@+
BB138
Marsh Posté le 28-05-2008 à 15:43:44
C'est peut etre un peut tard pour reouvrir ce post, mais j'ai une question tout à fait similaire, concernant boost::signal
je souhaite binder une methode membre (une callback) à un signal boost, par .connect
Mais je ne parviens pas à lui passer le pointeur vers ma fonction comme il se doit.
Marsh Posté le 28-05-2008 à 20:19:17
Exemple pour un signal de envoyant un float en paramètre:
Code :
|
Marsh Posté le 31-01-2005 à 19:07:26
Bonjour,
Je voudrais faire une chose comme ce qui suit mais j'ai un probleme et ne sait pas comment faire appel au pointeur sur fonction membre... Si vous avez une idee...