オブジェクトとメンバーを指すベア関数ポインターがある場合、メンバー関数を呼び出す最良の方法は何ですか? 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)();