Fonction membre de classe que le rappel à l'aide de boost::bind et boost::function
Je suis en train de travailler à travers la mise en place d'une fonction membre comme un rappel pour un C-bibliothèque que j'utilise. Le C-bibliothèque met en place des rappels comme ceci:
typedef int (*functionPointer_t)(myType1_t*, myType2_t*, myType3_t*);
setCallback(param1, param2, functionPointer, param4)
Je voudrais utiliser boost::bind (si possible) pour passer le pointeur de fonction. Je préférerais que la fonction pointée était un membre de la instancié de la classe, pas un membre statique. E. g.
Class A {
public:
A();
protected:
int myCallback(myType1_t*, myType2_t*, myType3_t*); //aka functionPointer_t
}
Cela peut être fait en utilisant boost::bind et boost::function? Par Comment puis-je passer une fonction membre de classe comme un rappel? (la 3ème réponse) il semble que je pourrais déclarer les éléments suivants (quelque part, ou qu'un typedef):
boost::function<int (A*, myType1_t*, myType2_t*, myType3*> myCallbackFunction
Et puis, quelque part dans Un (ctor) appel boost::bind sur ce type, et la passer dans le C-appel de la bibliothèque.
Est-ce possible, ou suis-je à côté de la plaque? Merci beaucoup.
OriginalL'auteur jdt141 | 2010-01-04
Vous devez vous connecter pour publier un commentaire.
Pas. Foncteur des types comme
boost::function
ne se convertissent pas à des pointeurs de fonction pour une utilisation avec C rappel des mécanismes.Cependant, la plupart des C rappel des mécanismes d'avoir une sorte de jeton de mécanisme, de sorte que votre fonction de rappel (qui est statique) a un certain type d'informations de contexte. Vous pouvez utiliser cette fonction pour écrire une classe wrapper qui mappe ces jetons pour le foncteur des objets, et passe à l'exécution le long de la droite:
Désolé, j'ai raté la partie de votre post. Édité pour corriger.
jdt141: Pouvez-vous de l'abus de l'un des
param1, param2, param4
danssetCallback
à se faufiler dans un jeton qui sera retourné à vous par le biais deint (*functionPointer_t)(myType1_t*, myType2_t*, myType3_t*)
?Emile - totalement raté votre commentaire. Je crois que je peux mais cette méthode décrite ci-dessus a bien fonctionné pour moi jusqu'à présent
OriginalL'auteur Ben Straub
ne pas utiliser la carte, il donne de l'exécution de la surcharge et de l'encombrement de code avec carte statique.
utilisation
reinterpret_cast
à la place.par exemple
OriginalL'auteur theambient
Le problème avec les fonctions de membre est qu'ils reçoivent automatiquement un pointeur vers l'instance de l'objet en tant que premier paramètre - pointeur "this". C'est pourquoi vous ne pouvez pas utiliser les fonctions de membre d'un C les fonctions de rappel. Vous devez disposer de l'objet ET la fonction de pointeur ensemble afin d'utiliser une fonction membre.
Vous pouvez, mais c'est compliqué. Ce:
A a; a.call();
est équivalent à ceci:A a; A::call(&a);
que par le C++ spécification, je crois. Le problème est que les raw d'un pointeur de fonction ne peut pas porter le long de lathis
pointeur avec elle.merci!!!! qui explique beaucoup de choses. a fait trop axé sur une approche et n'a pas pris la voie la plus évidente.
OriginalL'auteur Budric