Quelle est la meilleure façon d'appeler une fonction membre si vous avez un objet et un pointeur de fonction nue pointant vers le membre? Essentiellement je veux appeler le pointeur de fonction avec la convention d'appel thiscall
. Arrière-plan: Je recherche dynamiquement des symboles dans une bibliothèque partagée, obtenant un pointeur de fonction d'usine et un pointeur vers une certaine fonction de membre que je veux appeler. La fonction membre elle-même n'est pas virtuelle. Je n'ai aucun contrôle sur la bibliothèque partagée, j'ai juste le binaire.Appel d'une fonction membre avec un pointeur de fonction nue
Exemple:
typedef void * (*GenericFptr)();
GenericFptr lookup(const char *);
class CFoo;
GenericFptr factoryfn(lookup("CFoo factory function"));
CFoo *foo = reinterpret_cast<CFoo *>(factoryfn());
GenericFptr memberfn(lookup("CFoo member function"));
// now invoke memberfn on foo
Actuellement, je suis en utilisant un union
pour convertir le pointeur de fonction à un pointeur vers une fonction membre. Il est laid et crée des dépendances au compilateur détails d'implémentation:
class CFoo {
public:
void *dummy() { return 0; }
};
typedef void * (CFoo::*FooMemberPtr)();
union {
struct {
// compiler-specific layout for pointer-to-member
void *x, *y;
GenericFptr ptr;
} fnptr;
FooMemberPtr memberfn;
} f;
f.memberfn = &CFoo::dummy; // init pointer-to-member
f.fnptr.ptr = memberfn; // rewrite pointer
void *result = (foo->*f.memberfn)();
comment avez-symboles pour la fin fonction membre dans l'objet partagé? lorsque j'essaie de le faire, les symboles de fonction de membre non virtuel ne sont pas publiés. –