转载:http://www.cnblogs.com/nbsofer/p/get_member_function_address_cpp.html
一、通过静态转换
template<class dst_type, class src_type>
dst_type pointer_cast(src_type src)
{
return *static_cast<dst_type*>(static_cast<void*>(&src));
}
二、通过联合体的共享存储机制
template<class dst_type, class src_type>
dst_type union_cast(src_type src)
{
union
{
src_type s;
dst_type d;
} u;
u.s = src;
return u.d;
}
三、通过C语言的可变参数不检测参数类型(32位平台)
__declspec(naked) void* __cdecl cdecl_cast(...)
{
__asm
{
mov eax, dword ptr[esp+4]
ret
}
}
四、通过汇编的offset语句取成员函数偏移得到地址(需要VS2012以上)
#define asm_cast(var, addr) \
{ \
__asm \
{ \
mov var, offset addr\
} \
}
测试代码
class A
{
public:
void fun() {};
};
int main(int argc, char* argv[])
{
A a;
cout << std::hex << &a << '\n';
cout << pointer_cast<void*>(&A::fun) << endl;
cout << union_cast<void*>(&A::fun) << endl;
cout << cdecl_cast(&A::fun) << endl;
void* p = NULL;
asm_cast(p, A::fun);
cout << p << endl;
return 0;
}