用C++自写的Any

     相信大家都很熟悉JAVA的Object类,或多少也知道boost里的any吧,而小编不才写了个类似的玩意出来,下面我来说下这个玩意有啥不同和特别之处及实现的原理。

    首先展示Any类型功能:

用C++自写的Any

1.首先肯定是一个Any对象哈,(注意:这个Any不是boost库的,这是作者写的哈)

2.其次直接给它赋值一个字符串s,拿出来的时候用泛型转换后得到该字符串并输出哈

3.有趣的是它也可以把自己直接拷贝给别人(代码:string b =s),看图输出结果跟最开始给s赋的值相同

4.s =ceshi(55),看到这行不难发现这个Any定义出来的对象是可以被赋值任何对象的,输出结果如图所示

5.赐予vector向量Any类型,向量插入数据的时候一样可以随便插入各种类型数据

6.其次它的底层数据是使用智能指针unique_ptr实现,所以它可以在给该变量赋值为空的时候自动释放被存到里面new出的空间

下面是基于Any封装的AnyMap键值容器:

用C++自写的Any

其实跟把Any放在vector里原理一样都是可放随意类型,而说到这里肯定会有个疑问,竟然可以把Any放在vector里面,为啥不一样使用Map,其实这个跟上面说的自动释放内存一样,这里当你删除一个元素的时候如果该元素是new出来的空间也会自动清楚。

实现原理:

用C++自写的Any

在数字1这里就是初始化不用讲啦,数字2这里就是根据=号左边的类型来获取是否有该值,没有返回nullptr,数字3是从数据里获取到指向无类型的数据,经过在数字2那一步指定类型的转换返回出去,而这时读者肯定会有个疑问Any为什么可以不需要指定类型可以随便赋值各种类型数据,其实这就是接下来讲的重点。这个类里边核心变量数据m_data,也就它一个,它是关键。


m_data数据的类

用C++自写的Any

abstacatData有个嵌入类AnyDate,而AnyDate又继承于abstacatData,从这个嵌入类可以看出这是一个普通的模板类,再回来我们的Any类,它也继承abstacatData这个父类用C++自写的Any,所以AnyDate就有操作AnyDate的权限,用C++自写的Any根据我们Any类里给m_date赋值看出是new了一个AnyDate对象并根据模板类型存储数据,而我们m_date是abstacatData类型,是AnyDate的父类,而基类只是一个普通的类,所以可以直接保存创建的AnyDate对象的地址,在Any内部赋值的时候是AnyDate需要泛型,而abstacatData不需要泛型,所以就实现了创建Any对象时不用写指定类型。AnyMap原理与其一样,只是在外面利用Map再次帮装了一遍就不贴出来了哈。

      新人一枚,第一次发表博客,写的不好忘请见解哈哈!!

点击下载:源码链接