说明:由于代码较为庞大,类variant源码请参考\eos\libraries\fc\src中的variant.hpp与variant.cpp文件^_^.
首先概览一下这个庞大的类,细数一下,包含24个构造函数,囊括了24个构造函数,复制构造函数,十几个有效值的判断,十来个的get函数,各种运算符的重载,右值引用,等等,类的内部还设计了一个访问者类,类外部再有对variant的重封装、定义,只为打造一个万能容器,能够存储任何类型的数据,下面来看看它是如何实现与工作的。
1.支持类型的定义:
从构造类型来看,从1,2,4,8各种字节的有符号和无符号类型、宽字节、符点型、bool类型、各种指针、string,拿一个实现的看看:
this指针强转后赋值,那我们看看variant的成员变量:
基本类型不会超过16个字节,是安全的,没有问题,后面还有一个操作,用来将来判断类型,如果资源需要释放,这里就起作用了:
注意set_variant_type不是variant的成员函数,把数据类型的赋给了最后一个字节(这里说法不严格,自行理解…),此类的第一个走位。
基本类型OK了,那么扩展类型呢,成员的内存不够用,只能用new了,如下:

有一点,宽字节的字符串也转换成单节字字符串了再存储。有内存的分配就有释放:

注意指针的强转,一定要保证自定义类型内存的正确释放和析构函数的调用。再看看数据的获取:
这里代码很明显,对于带有数组类型性质的自定义类型,是支持下标操作的。还有一些带AS操作的类型转换函数:
还有很多其它在fc命名空间下的全局函数:
这里其实是搭配使用的,基本上实现任意类型之间的强转,引用一句话:强转是极度危险的,除非你自己知道自己在干什么^_^
另外,variant还几乎重写了所有运行符重载:
如此,我们也可以在这里增加自己的类型,实现数据的存储,是无限扩展,但可能也需要自己重写一部分的重载函数和运行符。
这个类中还有一些的操作,以后有时间再回来看看。

转载于:https://www.cnblogs.com/hbright/p/9234973.html

类variant解剖相关推荐

  1. java uuid静态方法_Java UUID的variant()方法和示例

    java uuid静态方法 UUID类variant()方法 (UUID Class variant() method) variant() method is available in java.u ...

  2. c++ advanced(8) std::variant from beginner to expert

    目录 std::variant(c17) questions and existing problems variant: and VS or Why not Union Solution varia ...

  3. JAVA反射通俗易懂转 转载大牛的 通俗易懂

    https://blog.csdn.net/sinat_21843047/article/details/80066333 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class, ...

  4. Java、Android基础之—反射

    前言 写这篇文章原因之一,是因为之后会对一些Android第三方框架进行分析.虽不能达到完全清晰,但大体的涉及知识需明白. 反射概述 反射是框架设计的灵魂.(使用的前提条件:必须先得到代表的字节码的C ...

  5. 【转】Java基础知识整理

    本博文内容参考相关博客以及<Java编程思想>整理而成,如有侵权,请联系博主. 转载请注明出处:http://www.cnblogs.com/BYRans/ PDF版下载链接:<Ja ...

  6. JAVa面向对象--反射

    反射就是把就java中的各种成为映射想成java类.例如:众多的人用一个person类来表示,那么众多的java类就用一个class类来表示. 反射也称为对类的解剖.把类的各个组成部位映射成一个个相应 ...

  7. java 基础知识总结

    Java基础知识总结 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思 ...

  8. JAVA反射机制及其原理实现

    9.1 概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:public.protected.private. OO ...

  9. 带有Jersey和Spring的RESTful Web应用程序

    几个月前,我们的任务是创建一个API,以向第三方开发人员公开我们系统中的某些功能. 我们选择将这些功能公开为一系列REST Web服务. 我开始使用Jersey ,它是JSR 311 (用于Restf ...

最新文章

  1. linux内核的进程管理,Linux内核设计与实现——进程管理
  2. mysql的优化之table_open_cache 篇_mysql性能优化之table_open_cache
  3. Django站点管理、视图和URL(管理界面本地化、创建管理员、注册模型类、发布内容到数据库、定义视图、配置URLconf)
  4. Android网络编程之使用HTTP訪问网络资源
  5. Tomcat connector 实现原理
  6. Python开发面试题及部分答案分享!
  7. Python判断函数与方法
  8. linux周期执行某任务方法
  9. 网络流入门题目 - bzoj 1001
  10. 合格前端系列第九弹-前端面试那些事
  11. npm修改全局包安装路径
  12. 手机变身电脑摄像头 Droidcam使用
  13. Hadoop Streaming和Pipes会意
  14. IT30: 数字化转型之路
  15. C#MySql.Data报错Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
  16. python爬取js_Python爬取javascript(js)动态网页
  17. 为什么程序员应该写博客?用什么博客系统?在哪写?
  18. 管理的艺术--达尔文进化论:适者生存 末位淘汰
  19. 信号与槽的Connect详解
  20. 联想昭阳N4620Z笔记本实现UOS和Windows双启动

热门文章

  1. TEAM WORK 認清自己的角色
  2. Netty之粘包分包
  3. 制作系统盘,重装新系统。
  4. 实验五 操作系统之存储管理
  5. JavaScript 数组详解
  6. 漂亮的页面向导和Tab插件(Jquery)
  7. 百老汇原版音乐剧《摇滚学校》2月开启中国巡演
  8. 二叉树的先序、中序、后序遍历
  9. Solr增删改查索引
  10. gcc-5.4.0 static dwarf2 compile