在c++中,我们想获取一个对象的地址,直接&(取地址符)就可以,但是如果一个了类重载的&运算符,我们怎么获取它的对象的地址呢?
如:
#include <iostream> #include <boost/utility.hpp> using namespace std; class foo { public: int operator&(){ return 100; } }; int main() { foo f; cout<<&f<<endl; foo* pf = boost::addressof(f); cout<<pf<<endl; }
可以直接用boost中的addrssof争取获取对象的地址,不管其是否重载了&运算符,
template <class T> struct addressof_impl{ static inline T* f(T& v, long){ return reinterpret_cast<T*>(&const_cast<char&>(reinterpret_cast<const volatile char &>(v))); } static inline T* f(T* v, int){ return v; } };
boost addressof中用了这样一段代码,也可以这样解释,也就是说c++标准保证,如果一个T1类型的对象x,被强制转换成了一个T2类型引用,那么T2引用是引用着T1对象,想当于*reinterpret_cast<T2*>(&x) 。所以说addressof()函数的实现是基于上述规定的。
class object { public: int operator&(){ return 100; } }; object obj; object* pobj = (object*)&(char&)obj;
from:
http://blog.csdn.net/demon__hunter/article/details/5450498
时间: 2024-10-16 19:56:00