template<typename AddressType, typename FuncPtrType>
AddressType union_cast(FuncPtrType func_ptr) // 获取类内成员函数的函数地址
{
union
{
FuncPtrType f;
AddressType d;
}u;
u.f = func_ptr;
return u.d;
}
不得不说这个方法确实很巧妙,完美的利用了联合体 union 的优点,当然模板的使用也使得该函数可迁移性更强。
#define asm_cast(var,addr) \
{ \
__asm \
{ \
mov var, offset addr \
} \
}
注意:除去最后一行,其他行结尾必须保留 \ 符号
测试类代码如下:
class A
{
private:
int m_val;
public:
A(const int val):m_val(val){}
const int* getValAddress()
{
return &m_val;
}
int getVal()
{
return m_val;
}
};
测试功能代码:
void test()
{
A a1(10);
A a2(10);
// 检验相同类生成的不同对象对应 成员变量地址 是否一致 --->(不一致)
cout << "&(a1.val) = " << a1.getValAddress() << endl;
cout << "&(a2.val) = " << a2.getValAddress() << endl;
// 检验相同类生成的不同对象对应 成员函数地址 是否一致 --->(一致)
void* ptr1 = union_cast<void*>(&A::getValAddress);
void* ptr2 = 0; asm_cast(ptr2, A::getValAddress);
// 打印成员函数指针的值
std::cout << "Address_1 of myMethod: " << ptr1 << std::endl;
std::cout << "Address_2 of myMethod: " << ptr2 << std::endl;
}
运行结果: