深入理解C++对象模型之类型转换:ReinterpretCast
2010-04-08 20:35
711 查看
在C++中,没有任何一种转换操作符可以将成员指针转换成其它类型数据类型,那有没有办法获取到成员指针的值呢?有的人会说可以通过sprintf,atoi等函数获取.那有没有更简单通用的方法呢?答案是有的.我们可以通过template 和 union实现任何类型到另一兼容类型的(所谓兼容是指,两种类型的大小一致)转换操作符 ReinterpretCast<Dest,Src>.
在给出这一实现之前,我们先来先来探讨一下另外一个实用宏: StaticAssert.
StaticAssert宏是利用这样一个语法事实:不能将sizeof应用于任何非完全类型.下面是StaticAssert的实现:
接下来我们会给出ReinterpretCast<Dest,Src>的实现:
下面我们来写一小段测试代码:
输出:
未经允许,请勿转载.
Copyright © SammyLan
在给出这一实现之前,我们先来先来探讨一下另外一个实用宏: 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
相关文章推荐
- [深入理解C++(一)]类型转换(Type Casting)
- [深入理解C++(一)]类型转换(Type Casting)
- c++对象模型笔记:指针类型转换
- NS2笔记 之 OTcl与C++ (分裂对象模型的深入理解)
- 深入理解 C++ 指针(八)---指针类型转换
- 《深入理解C++对象模型》何时合成Default Constructor
- 学习《深入理解C++对象模型》小结
- [iOS]深入理解__bridge - OC对象与C++对象的引用转换
- 深入理解C++对象模型-对象的内存布局,vptr,vtable
- 深入理解C++的对象模型
- 深入理解C++对象模型-成员函数的本质以及虚函数的实现(非虚继承)
- [深入理解C++(一)]类型转换(Type Casting)
- [深入理解C++(一)]类型转换(Type Casting)
- 【深入探索c++对象模型】抽象类和纯虚函数的理解
- 深入探索C++对象模型--指针类型 & 多态机制
- [深入理解C++(一)]类型转换(Type Casting)
- 深入理解C++对象模型之Data Member存取成本
- 深入理解C++对象模型之构造函数
- 深入理解C++对象模型之拷贝构造函数
- 深入理解C++对象模型-对象的内存布局,vptr,vtable