Folco (./13) :
La seule solution que j'ai trouvée, mais qui me fait suer, c'est d'avoir la fonction 'func' externe à la classe, alors que j'ai besoin que ce soit une méthode pour me simplifier l'existence.
Vous voyez un moyen de contourner ça ?
Non. Le mieux que tu peux faire, c'est d'utiliser une méthode statique (ce qui est aussi interdit par le standard C++, mais permis par une extension de g++, extension qui permet d'utiliser les pointeurs sur méthodes statiques comme des pointeurs de fonction), mais ça ne change pas beaucoup par rapport à une simple fonction.
Zeph (./14) :
Tu est en train de mélanger pointeur sur fonction et pointeur sur méthode. C'est incompatible, ne serait-ce que parce que ton "void (*f)(int i)" est une fonction qui ne prend qu'un paramètre de type int, alors que "func" dans ta classe "A" est une méthode qui prend deux arguments : this, et un int. (bon de toutes façons en vrai c'est incompatible également pour d'autres raisons)
Il te faut un pointeur sur méthode : typedef void (A::*f) (int)
(puis this->s.f = &A::func, pas this->func ; ça serait pratique de pouvoir capturer le "this" au passage, mais tu n'es qu'en C++
)
Ça ne marchera pas, il utilise visiblement une bibliothèque externe (probablement écrite en C, pas en C++) qui demande un pointeur de fonction.
D'ailleurs, dans ces prototypes de callbacks, je ne vois même pas de paramètre de type
void *user_data qui permettrait de passer un pointeur vers l'objet (la solution courante à ce problème:
void toto_wrapper(void *user_data, int foo, int bar) {
static_cast<A*>(user_data)->toto(foo, bar);
}
void A::toto(int foo, int bar) {
// blabla
}
où on passe un pointeur vers un objet de type A quelque part avant, et la bibliothèque le restitue dans
user_data).

Donc, il faudra probablement soit faire comme en C et laisser tomber l'objet ici, soit stocker un singleton dans une variable globale (
A* global_a;, ou alors une solution plus évoluée, cherche "singleton pattern").