【发布时间】:2011-03-10 03:06:24
【问题描述】:
如果你有一个对象和一个指向成员的裸函数指针,那么调用成员函数的最佳方法是什么?本质上我想用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)();
【问题讨论】:
-
成员函数的符号是如何出现在共享对象中的?当我尝试这样做时,不会发布非虚拟成员函数符号。
标签: c++ function-pointers member-function-pointers