boost::any( 能存放任何类型的数据)原理

=====================

template<class T>

class any

{

public:

T m_data;

};

void main()

{

any<int> a;

}

缺点是 必须知道类型,有时我们并不知道某个对象的类型。

-------------

class any

{

public:

template<class T>

any(const T& t)

{

m_pData = new T(t);

}

protected:

void* m_pData;

};

void main()

{

any  a(3);

}

void*是不安全的。

--------------

#include <iostream>

using namespace std ;

class any

{

public:

template<class T>

any(const T& t)

{

m_pData = new CType<T>(t);

}

//析构函数省略

class CTypeRoot

{};

template<class T>

class CType : public CTypeRoot

{

public:

CType(const T& t):m_value(t)

{

}

T m_value;

};

public:

CTypeRoot* m_pData;

};

void main()

{

any  a(3);

}

可以编译通过了,但无法取值。

===============

#include <iostream>

#include <string>

using namespace std ;

class any

{

public:

template<class T>

any(const T& t)

{

m_pData = new CType<T>(t);

}

//析构函数省略

class CTypeRoot

{};

template<class T>

class CType : public CTypeRoot

{

public:

CType(const T& t):m_value(t)

{

}

T m_value;

};

public:

CTypeRoot* m_pData;

};

template<typename ValueType>

ValueType any_cast(const any& operand,const ValueType tDefault = ValueType() )

{

any::CType<ValueType>* p = static_cast<any::CType<ValueType>* >(operand.m_pData);

return p->m_value;

}

void main()

{

any  a(3);

int y = any_cast<int>(a);

//    string y1 = any_cast<string>(a); //运行出错

}

时间: 2024-10-06 17:46:40

boost::any( 能存放任何类型的数据)原理的相关文章

oracle中时间戳转为Date类型的数据

问题描述: 一个表中原本应该存放date类型的数据,但是不知道之前哪位大仙把两个字段的类型建成了NUMBER类型的了,这样在后台看时间肯定不方便.现在需要改成date类型,但是现在库中是有数据的,不能直接从NUMBER改为DATE.所以需要建立先创建两个DATE类型的临时字段,然后把对应字段的数据转换为Date类型的数据之后存到新字段上面,最后删除老字段,将新字段改名为老字段. 一.新建两个临时字段 ALTER TABLE CS_USER ADD (CREATEDATE1 DATE,OPERAT

Caffe3——ImageNet数据集创建lmdb类型的数据

Caffe3——ImageNet数据集创建lmdb类型的数据 ImageNet数据集和cifar,mnist数据集最大的不同,就是数据量特别大:单张图片尺寸大,训练样本个数多:面对如此大的数据集,在转换成lmdb文件时:使用了很多新的类型对象. 1,动态扩容的数组“vector”,动态地添加新元素 2,pair类型数据对,用于存储成对的对象,例如存储文件名和对应标签 3,利用opencv中的图像处理函数,来读取和处理大尺寸图像 一:程序开始 由于要向imageNet数据集中设置resize和是否

Caffe2——cifar10数据集创建lmdb或leveldb类型的数据

Caffe2——cifar10数据集创建lmdb或leveldb类型的数据 cifar10数据集和mnist数据集存储方式不同,cifar10数据集把标签和图像数据以bin文件的方式存放在同一个文件内,这种存放方式使得每个子cifar数据bin文件的结构相同,所以cifar转换数据代码比mnist的代码更加的模块化,分为源数据读取模块(image_read函数),把lmdb(leveldb)数据转换的变量声明,句柄(函数)调用都放到定义的caffe::db子空间中,这样简化了代码,而且使得代码更

不同类型的数据跨表空间迁移的解决办法

http://blog.csdn.net/passion_wang/article/details/6541369 Oracle10g数据跨表空间迁移 因某些开发人员由于对oracle数据库理解的不够深入,往往在建表的时候指定了当前用户非默认的表空间,这样就导致了在exp及imp等操作时候问题很多,因此需要将这些表及相关的数据迁移回当前用户的默认表空间里.Oracle10g数据数据库提供了一个Move命令可以把这样的数据对象进行跨表空间的迁移,也可以对含有BLOB.CLOB这样的二进制大字段的表

c# 的引用类型和值类型和数据的拆箱和装箱

c#中引用类型和值类型的区分: 一般的以calss声明的变量的类型是引用类型的,引用类型是存放到内存的堆上存放的是数据的地址.值类型是像int float 还有struct等属于值类型的数据类型,值类型的数据是存放在堆栈上的存放的数据本身. 拆箱和装箱: 我们可以用一个例子来理解装箱和拆箱的关系和作用.我们都知道小时候在村里有哪种你给他一些铝制品他可以给你溶成一个你想要的其他的铝制器件.装箱和拆箱就是这个原理.例如:你想把一种数据类型转化为另一种数据类型,int16到int32的数据类型的转化,

C++ socket编程——3种方法发送不同类型的数据

socket传送数据,一般来讲是char型的,如何传送我们需要的数据类型勒? 1.结构体:2, Json序列化,3. 定义一个class. 1.结构体 相对来说简单点,看看网上的一个例子: 假设需要传送的结构体如下: struct person{ char name[20]; int age; float high; }; 可在发送数据的地方对数据进行处理,将其转换成一个字符串进行传送,而在接受方定义相同的结构体对这个字符串进行解析即可. 发送方代码如下: char temp[100];   

Caffe1——Mnist数据集创建lmdb或leveldb类型的数据

Caffe1——Mnist数据集创建lmdb或leveldb类型的数据 Leveldb和lmdb简单介绍 Caffe生成的数据分为2种格式:Lmdb和Leveldb.它们都是键/值对(Key/Value Pair)嵌入式数据库管理系统编程库.虽然lmdb的内存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允许多种训练模型同时读取同一组数据集. 因此lmdb取代了leveldb成为Caffe默认的数据集生成格式(http://blog.csd

不同平台下int类型、指针类型的数据大小

不同平台下int类型.指针类型的数据大小 对于int类型数据和指针类型数据的大小,是非常基础的问题. 在一个具体的平台上,确定他们最好的办法就是使用sizeof(type)对其进行判断,返回当前数据类型的大小. 在不同的平台下,int类型和指针类型的数据类型大小时怎样的呢?如果要给出一个统一的答案,自然不可能集齐每个平台,一个个地去试,我们必须从底层进行分析. 数据总线和地址总线 计算机内的数据总线是CPU与外设进行数据交换的通路,而地址总线则是CPU用于寻址的通路. 数据总线的位数决定了CPU

键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...

有一道很有意思的数组操作相关编程题,闲来无事用JS解决了一下,问题描述如下: (1) 键盘录入6个int类型的数据存入数组arr中: (2) 将arr数组中的内容反转: (3) 将反转后的数组角标为奇数的元素相互交换,即1和3交换,3和5交换,以此类推: (4) 将数组中最后一个角标为奇数的元素和数组中第一个角标为奇数的元素交换: (5)打印最终的数组,(实现了1—4步之后的数组) 示例:如用户输入的6个整数为[1,2,3,4,5,6]>[6,5,4,3,2,1]>[6,3,4,1,2,5]&