您的位置:首页 > 编程语言 > C语言/C++

深入理解C++对象模型之类型转换:ReinterpretCast

2010-04-08 20:35 711 查看
在C++中,没有任何一种转换操作符可以将成员指针转换成其它类型数据类型,那有没有办法获取到成员指针的值呢?有的人会说可以通过sprintf,atoi等函数获取.那有没有更简单通用的方法呢?答案是有的.我们可以通过template 和 union实现任何类型到另一兼容类型的(所谓兼容是指,两种类型的大小一致)转换操作符 ReinterpretCast<Dest,Src>.
在给出这一实现之前,我们先来先来探讨一下另外一个实用宏: StaticAssert.
StaticAssert宏是利用这样一个语法事实:不能将sizeof应用于任何非完全类型.下面是StaticAssert的实现:
//StaticAssert.hxx

#pragma  once

template<bool Failure>

struct StaticAssert_;
template<> struct StaticAssert_<true>{};

#define StaticAssert(exp) sizeof(StaticAssert_< static_cast<bool>(exp) >)

接下来我们会给出ReinterpretCast<Dest,Src>的实现:
//GetVptr.hxx

#pragma  once
#include <ReinterpretCast.hxx>

template <class T>
long * GetVptr(T const & obj)
{
long * pVptr = ReinterpretCast<long*>(&obj);
return ReinterpretCast<long*>(* pVptr);
}

template <class T> long * GetVptr(T*) {StaticAssert(0);return 0;}
template <class T> long * GetVptr(T const* const){StaticAssert(0);return 0;}

下面我们来写一小段测试代码:
//main.cpp

#include <iostream>
#include <ReinterpretCast.hxx>
using namespace std;

class Test
{
public:
virtual void VirtualMemFunc(){}
virtual void NonVirtualMemFunc(){}
int m_iData;
};

int main(int argc, char* argv[])
{
void * pFunc = ReinterpretCast<void*>(&Test::VirtualMemFunc);
cout<<ReinterpretCast<void*>(&Test::VirtualMemFunc)<<endl;
cout<<ReinterpretCast<void*>(&Test::NonVirtualMemFunc)<<endl;
cout<<ReinterpretCast<void*>(&Test::m_iData)<<endl;

return 0;
}


输出:

0041114F
004111DB
00000004
请按任意键继续. . .


未经允许,请勿转载.
Copyright © SammyLan
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: