Je travaille grâce à la configuration d'une fonction de membre comme rappel pour une bibliothèque C dans laquelle j'utilise. La C-Bibliothèque définit des rappels comme ceci:
boost::function<int (A*, myType1_t*, myType2_t*, myType3*> myCallbackFunction
3 Réponses :
Le problème avec les fonctions des membres est qu'ils reçoivent automatiquement un pointeur à l'instance d'objet comme premier paramètre - "Ceci" pointeur. C'est pourquoi vous ne pouvez pas utiliser les fonctions des membres une fonction de rappel C. Vous devez avoir l'objet et le pointeur de fonction ensemble afin d'utiliser une fonction de membre. P>
Cela n'a pas de sens. Si c'était vrai, je ne serais pas en mesure de réprimer un boost :: Fonction à un pointeur brut par Stackoverflow.com/Questtions/282372/...
Vous pouvez réellement, mais c'est compliqué. Ceci: aa; A.Call (); code> est équivalent à ceci:
aa; A :: Call (& a); code> selon la spécification C ++, je crois. Le problème est qu'un pointeur de fonction brut ne puisse apporter le long du pointeur code> code> avec elle.
Je vous remercie! ça explique beaucoup. Je suis tout simplement trop concentré sur une approche et n'a pas pris la route évidente.
non. Les types de foncteurs tels que boost :: fonction code> ne convient pas aux pointeurs de fonction pour une utilisation avec des mécanismes de rappel C. Cependant, la plupart des mécanismes de rappel ont une sorte de mécanisme de jeton, donc votre fonction de rappel (qui est statique) a une sorte d'informations contextuelles. Vous pouvez l'utiliser pour écrire une classe wrapper qui mappe ces jetons vers des objets foncteurs et passe l'exécution à droite: p>
Je ne peux pas changer l'interface de SetCallback
@ jdt141: Pouvez-vous abuser de l'un des param1, param2, param4 code> dans
setCallback code> pour se faufiler dans un jeton qui vous sera renvoyé via
int (* fonctionOpointer_t) (mytype1_t *, mytype2_t *, mytype3_t *) code>?
Emile - a totalement manqué votre commentaire. Je crois que je peux, mais cette méthode décrite ci-dessus a bien fonctionné pour moi jusqu'à présent
N'utilisez pas de carte, il donne au-dessus de la tête d'exécution et le code d'encombrement avec carte statique.
Utiliser Par exemple P> REINERPRET_CAST CODE>. P>
// clib.h
typedef void (*CALLBACK_FUNC)(int code,void *param);
void set_callback( CALLBACK_FUNC, void * param );
// a.h
class A {
public:
A()
{
::set_callback( &A::static_callback, this);
}
private:
static void static_callback(int code, void * param)
{
A* self = reinterpret_cast<A*>(param);
self->callback( code );
}
inline void callback( int code )
{
// write you code here.
}
};