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

时间: 2024-10-16 19:56:00

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

openpyxl获取表格测试数据(类与对象)

from openpyxl import load_workbook class Case: def __init__(self): self.case_id = None self.title = None self.method = None self.url = None self.data = None self.expected = None self.actually = None self.result = None class ReadData: def __init__(sel

淘宝sdk - 类目对象

//----------查看对象成员---------------------------------- //get_class(对象资源);  get_class_methods(对象类名); $categorys = $shopCategoryManager->queryAll();$classObj = get_class($categorys[0]);$classMethods = get_class_methods($classObj);var_dump($classMethods);

JavaScript 浅析数组对象与类数组对象

数组(Array对象) 数组的操作 创建数组方法 添加与修改数组元素 删除数组元素 使用数组元素 遍历数组元素 多维数组 数组相关的函数 concat() join() pop() push() shift() unshift() reverse() sort() slice() splice() 类数组对象 定义 举例 对比数组 转换 间接 直接 数组(Array对象) 数组就是一组数据. 在JavaScript中没有数组这种数据类型.数组时对象创建的. 键(下标): 用于区分数组中不同数值的

225 对象与类 之 对象

2.1 对象 对象是由属性和方法组成的:是一个无序键值对的集合,指的是一个具体的事物 属性:事物的特征,在对象中用属性来表示(常用名词) 方法:事物的行为,在对象中用方法来表示(常用动词) 2.1.1 创建对象 //以下代码是对对象的复习 //字面量创建对象 var ldh = { name: '刘德华', age: 18 } console.log(ldh); //构造函数创建对象 function Star(name, age) { this.name = name; this.age =

通过反射来获取对应运行时类的完整结构

Class 对象可以调用其方法获取以下这些类的对象,这些类型分别对应着运行时类的某个结构:Field.Method.Constructor.Superclass.Interface.Annotation 通过这些类的对象,可以获取对应运行时类的: 实现的所有接口 所继承的父类 所有构造器 所有方法 所有属性 泛型 注解 package com.cdf.reflection; import java.lang.annotation.Annotation; import java.lang.refl

zend framework获取数据库中枚举类enum的数据并将其转换成数组

在model中建立这样的模型,在其中写入获取枚举类的方法 class Student extends Zend_Db_Table{ protected $_name ='student'; protected $_primary ='id'; function getPartyEnum($enumname){ //适配器并获取数据 $db = $this->getAdapter(); $db->query("SET NAMES GBK"); $sql = $db->q

获取mdb下要素类FeatureClass,独立要素类,没有dataset获取要素类

转载自:http://blog.sina.com.cn/s/blog_6faf711d0100za4x.html 获取mdb数据库要素类的名称 整体思路如下:1.通过IWorkspace的Datasets属性获取工作空间中的所有Dataset对象(IEnumDataset)2.枚举EnumDataset,获取Dataset对象3.如果该Dataset是FeatureDataset4.QI到IFeatureClassContainer接口for(int i=0;i < pFClContainer.

C#获取随机数(Random类)

C#获取随机数(Random类) 使用random可以获取你指定范围内的随机数: Random rd=new Random(); int i=rd.Next();//产生一个非负整数 int j=rd.Next(10);//产生0-9之内的整数 int k=rd.Next(10,100);// 10=100以内的数 int m=rd.NextDouble();//产生一个实型的随机数 [0,1]以内 注:  在高并发的情况下,随机数可能相同,可以通过线程sleep()来解决:

使用Powershell 的获取别的机器WMI类失败解决方法!

有些时候需要连接多台机器去获取他们的类,但是有些时候我们发现计算机无法连接,这个时候怎么办呢? 请修改组策略中以下配置: 可以使用Gpmc.msc 进行以后,本地计算机策略--计算机配置--管理模板--网络--网络连接--WIndow防火墙--允许远程管理启用 即可 截图如下: 使用Powershell 的获取别的机器WMI类失败解决方法!,布布扣,bubuko.com