OVH Cloud OVH Cloud

Foncteur, Pointeurs de fonctions, Classes

7 réponses
Avatar
Murlock
Bonjour à vous, gourous du C++

Je viens de passer à STL il y a quelques semaines pour refaire un vieux
projet en objet/STL/C++...

J'en arrive un moment où je dois effectuer des callbacks et j'ai
quelques questions, est-il obligé (conseillé ?) d'utiliser Boost pour
ses fonctions bind pour avoir la possibilité de faire des appels de
fonctions membres ou alors une autre solution existe-t-elle ?

un p'tit exemple de ce que je voudrais faire (de manière portable et
sans trop grosse magouilles dur à maintenir)

Class Boutton {

callback call;

void Event() {
// appeler le callback s'il est positionné
}

};

class interface {
std::list<Bouton*> lst;
//...
}

class interface_spe: public interface {
public:

void MaFonctionCallback() {
}

void Create() {
// ajout d'un bouton avec son callback
Bouton *b=new Bouton;
b.setCallBack( MaFonctionCallBack );
lst.push_back( b );
}

void Run() {
}
}



Cordialement
Michael

7 réponses

Avatar
darkman_spam
Murlock wrote in message <40e91075$0$25713$:

J'en arrive un moment où je dois effectuer des callbacks et j'ai
quelques questions, est-il obligé (conseillé ?) d'utiliser Boost pour
ses fonctions bind pour avoir la possibilité de faire des appels de
fonctions membres ou alors une autre solution existe-t-elle ?


Boost ne fait que fournir une solution utilisable, tout comme tu
pourais toi-même l'implémenter. Tu n'es donc pas obligé d'utiliser
Boost.

Sans doute peux-tu t'inspirer de ceci :

class Interface {
public:
void firstCallback() { }
void secondCallback() { }
} ;

class Boutton {
public:
Boutton( Interface * object , void ( Interface:: * func )() )
: myObject( object ) , myFunction( func )
{ }
private:
Interface * myObject ;
void ( Interface:: * myFunction )() ;
} ;

Mais il existe nombre de bibliothèques fournissant des outils
encapsulant tout cela, et nombre d'articles sur le sujet. À commencer
par Boost et Loki, la bibliothèque implémentée dans « Modern C++
Design » d'Andreï Alexandrescu.

Cfr. <URL:www.moderncppdesign.com/> et <URL:www.cuj.com/>, entre
autres.

--drkm

Avatar
Murlock
drkm wrote:
Murlock wrote in message <40e91075$0$25713$:


J'en arrive un moment où je dois effectuer des callbacks et j'ai
quelques questions, est-il obligé (conseillé ?) d'utiliser Boost pour
ses fonctions bind pour avoir la possibilité de faire des appels de
fonctions membres ou alors une autre solution existe-t-elle ?



Boost ne fait que fournir une solution utilisable, tout comme tu
pourais toi-même l'implémenter. Tu n'es donc pas obligé d'utiliser
Boost.

Sans doute peux-tu t'inspirer de ceci :
<snip>

Effectivement, ça mérite un examen approfondi


Mais il existe nombre de bibliothèques fournissant des outils
encapsulant tout cela, et nombre d'articles sur le sujet. À commencer
par Boost et Loki, la bibliothèque implémentée dans « Modern C++
Design » d'Andreï Alexandrescu.

Cfr. <URL:www.moderncppdesign.com/> et <URL:www.cuj.com/>, entre
autres.

--drkm



Merci pour toutes ces références, je vais potasser cette documentation à
tête reposé...

Cordialement,
Murlock


Avatar
Murlock
Pour information, j'ai implémenté la solution trouvé sur
http://www.function-pointer.org/.
Avatar
darkman_spam
Murlock wrote in message <40ebc1e2$0$29377$:

Pour information, j'ai implémenté la solution trouvé sur
http://www.function-pointer.org/.


Qui est ... ?

--drkm

Avatar
Murlock
drkm wrote:
Murlock wrote in message <40ebc1e2$0$29377$:


Pour information, j'ai implémenté la solution trouvé sur
http://www.function-pointer.org/.



Qui est ... ?

--drkm



http://www.function-pointer.org/functor.html#functors

Peut-être qu'il y a des inconvénients ? ou des effets de bords mais ça
semble me convenir

Cordialement;
Murlock


Avatar
Michaël Delva
Peut-être qu'il y a des inconvénients ? ou des effets de bords mais ça
semble me convenir


Me frappez pas, mais c'est quoi un effet de bord?

Avatar
darkman_spam
Murlock wrote in message <40ec5c8d$0$18107$:

drkm wrote:
Murlock wrote in message <40ebc1e2$0$29377$:

Pour information, j'ai implémenté la solution trouvé sur
http://www.function-pointer.org/.


Qui est ... ?


http://www.function-pointer.org/functor.html#functors


Merci.

Peut-être qu'il y a des inconvénients ? ou des effets de bords mais ça
semble me convenir


Il me semble qu'il s'agit d'une implémentation basique très
correcte. Par rapport à l'exemple simplissime que je t'ai donné, il
ajoute une base abstraite, et un paramètre de modèle pour la classe
dont on prend un pointeur vers une fonction membre.

Si je me souviens bien, Alexandrescu, dans Loki, fournit également
des paramètres de modèles pour le type de retour et des arguments (il
doit utiliser une TypeList pour les arguments, je pense). Toujours
d'après mes souvenirs, ses foncteurs son aussi plus généraux, dans le
sens où ils peuvent encapsuler un appel de pointeur vers fonction, ou
un appel de pointeur vers fonction membre, ou un appel de foncteur ...
Bref, tout ce qui est appelable.

--drkm