boost addressof--正确获取重载了&的类的对象的地址

在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

posted @ 2014-09-04 15:13  venid  阅读(380)  评论(0编辑  收藏  举报