Как лучше всего вызвать функцию-член, если у вас есть объект и голый указатель функции, указывающий на член? По сути, я хочу вызвать указатель функции с соглашением о вызовах thiscall.
Предыстория: я динамически просматриваю символы в разделяемой библиотеке, получая указатель фабричной функции и указатель на определенную функцию-член, которую я хочу вызвать. Сама функция-член не является виртуальной. У меня нет контроля над общей библиотекой, у меня есть только бинарный файл.
Пример:
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
В настоящее время я использую union для преобразования указателя функции в указатель на функцию-член. Это уродливо и создает зависимости от деталей реализации компилятора:
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)();