在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

转载于:https://www.cnblogs.com/venid/p/3956154.html

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐