Существует синтаксис для получения адреса функции-члена в MSVC (начиная с MSVC 2005 IMHO). Но это довольно сложно. Кроме того, полученный указатель невозможно привести к другому типу указателя обычными средствами. Хотя, тем не менее, существует способ сделать это.
Вот пример:
// class declaration
class MyClass
{
public:
void Func();
void Func(int a, int b);
};
// get the pointer to the member function
void (__thiscall MyClass::* pFunc)(int, int) = &MyClass::Func;
// naive pointer cast
void* pPtr = (void*) pFunc; // oops! this doesn't compile!
// another try
void* pPtr = reinterpret_cast<void*>(pFunc); // Damn! Still doesn't compile (why?!)
// tricky cast
void* pPtr = (void*&) pFunc; // this works
Тот факт, что обычное приведение не работает, даже с reinterpret_cast
, вероятно, означает, что MS не очень рекомендует это приведение.
Тем не менее, вы можете сделать это. Конечно, все это зависит от реализации, вы должны знать соответствующее соглашение о вызовах, чтобы thunking + обладал соответствующими навыками ассемблера.