说明:由于代码较为庞大,类variant源码请参考eoslibrariesfcsrc中的variant.hpp与variant.cpp文件^_^.
首先概览一下这个庞大的类,细数一下,包含24个构造函数,囊括了24个构造函数,复制构造函数,十几个有效值的判断,十来个的get函数,各种运算符的重载,右值引用,等等,类的内部还设计了一个访问者类,类外部再有对variant的重封装、定义,只为打造一个万能容器,能够存储任何类型的数据,下面来看看它是如何实现与工作的。
1.支持类型的定义:
从构造类型来看,从1,2,4,8各种字节的有符号和无符号类型、宽字节、符点型、bool类型、各种指针、string,拿一个实现的看看:
![](https://cdn.yuque.com/yuque/358/2018/png/127138/1527324146194-79000675-e13d-44f9-bd4a-735631602c62.png)
this指针强转后赋值,那我们看看variant的成员变量:
![](https://cdn.yuque.com/yuque/358/2018/png/127138/1527325402446-17468b00-4bad-4bd4-96cd-a49b6029703d.png)
基本类型不会超过16个字节,是安全的,没有问题,后面还有一个操作,用来将来判断类型,如果资源需要释放,这里就起作用了:
![](https://cdn.yuque.com/yuque/358/2018/png/127138/1527324173581-ce7306c6-e0ca-4465-9ccb-0de9587ef619.png)
注意set_variant_type不是variant的成员函数,把数据类型的赋给了最后一个字节(这里说法不严格,自行理解…),此类的第一个走位。
基本类型OK了,那么扩展类型呢,成员的内存不够用,只能用new了,如下:
![](https://cdn.yuque.com/yuque/358/2018/png/127138/1527327570313-8ccb110f-1828-440a-ae9c-7004326c606f.png)
![](https://cdn.yuque.com/yuque/358/2018/png/127138/1527327955778-cb384505-7978-4106-a666-744843ec65f9.png)
注意指针的强转,一定要保证自定义类型内存的正确释放和析构函数的调用。再看看数据的获取:
![](https://cdn.yuque.com/yuque/358/2018/png/127138/1527328234799-1fdb8bc7-dc4f-454f-96b1-68c04dc3bf92.png)
这里代码很明显,对于带有数组类型性质的自定义类型,是支持下标操作的。还有一些带AS操作的类型转换函数:
![](https://cdn.yuque.com/yuque/358/2018/png/127138/1527328575959-b1c60be2-22f0-4e10-adc8-0c822594218e.png)
还有很多其它在fc命名空间下的全局函数:
![](https://cdn.yuque.com/yuque/358/2018/png/127138/1527328866993-69d01d0a-f3a0-4e38-865a-89b8ed4d41a1.png)
这里其实是搭配使用的,基本上实现任意类型之间的强转,引用一句话:强转是极度危险的,除非你自己知道自己在干什么^_^
另外,variant还几乎重写了所有运行符重载:
![](https://cdn.yuque.com/yuque/358/2018/png/127138/1527328697633-82e0647f-16d4-4972-893f-bca3b1df57d8.png)
如此,我们也可以在这里增加自己的类型,实现数据的存储,是无限扩展,但可能也需要自己重写一部分的重载函数和运行符。
这个类中还有一些的操作,以后有时间再回来看看。