方法1: pointer_cast - 通过静态转换
template<typename dst_type,typename src_type> dst_type pointer_cast(src_type src) { return *static_cast<dst_type*>(static_cast<void*>(&src)); }
方法2: union_cast - 通过联合体的共享储存机制
template<typename dst_type,typename src_type> dst_type union_cast(src_type src) { union{ src_type s; dst_type d; }u; u.s = src; return u.d; }
方法3: asm_cast - 通过汇编的offset语句取成员函数偏移得到地址
#define asm_cast(var,addr) { __asm{ mov var,offset addr } }
使用方法及测试代码:
#include <iostream> using namespace std; class A { public: void fn(){} }; int main(void) { void* p1 = pointer_cast<void*>(&A::fn); void* p2 = union_cast<void*>(&A::fn); void* p3 = 0; asm_cast(p3,A::fn); return 0; }