说明:由于代码较为庞大,类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还几乎重写了所有运行符重载:
 
如此,我们也可以在这里增加自己的类型,实现数据的存储,是无限扩展,但可能也需要自己重写一部分的重载函数和运行符。
这个类中还有一些的操作,以后有时间再回来看看。
 

类variant解剖的更多相关文章

  1. Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)

    反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...

  2. Java---类反射(1)---类反射入门和基础

    什么是类反射 ☆什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方 ...

  3. boost数据结构variant

    variant和any有些类似,是一种可变类型,是对C/C++中union概念的增强和扩展:    普通的union只能持有普通数据类型,而不能持有string.vector等复杂类型,而varian ...

  4. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  5. fMRI数据分析处理原理及方法(转载)

    原文地址:http://www.cnblogs.com/minks/p/4889497.html 近年来,血氧水平依赖性磁共振脑功能成像(Blood oxygenation level-depende ...

  6. [Java面试二]Java基础知识精华部分.

    一:java概述(快速浏览): 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器: 1994年将Oak语言更名 ...

  7. fMRI数据分析处理原理及方法

    来源: 整理文件的时候翻到的,来源已经找不到了囧感觉写得还是不错,贴在这里保存. 近年来,血氧水平依赖性磁共振脑功能成像(Blood oxygenation level-dependent funct ...

  8. 黑马程序员——【Java高新技术】——反射机制

    ---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法: ...

  9. 黑马程序员——JAVA基础之反射

      ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! -------     Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态 ...

随机推荐

  1. matlab之find()函数

    Find 这个函数用处也挺大的,这几天看很多程序都见到这一函数,今天要好好给阐述,了解下这个函数是为了找到矩阵或者是数组,向量中的非零元素.下面一大段英文没耐心看.看看例子就行了. 第一个用法是 nd ...

  2. SGU 495 Kids and Prizes:期望dp / 概率dp / 推公式

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495 题意: 有n个礼物盒,m个人. 最开始每个礼物盒中都有一个礼物. m个人依次随 ...

  3. linux启动全过程

    参考: http://www.staroceans.org/e-book/linux-bootstrap-1.html 1. MBR里的内容属于grub grub-2.02\grub-core\boo ...

  4. spring2.5和struts1.3.8整合

    第一步:导入对应jar文件 第二步: 1.在web容器中实例化spring容器 <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpa ...

  5. Gym-101673: A Abstract Art (模板,求多个多边形的面积并)

    手抄码板大法. #include<bits/stdc++.h> using namespace std; #define mp make_pair typedef long long ll ...

  6. bzoj 2626: JZPFAR k-D树

    题目大意: 平面上n个点,每次给出一个点,求这个点的k远点 题解: 什么叫做k远点呢... 1 2 3 4 5中5是第一远,4是第二远... 看来我语文学的不好 那么我们直接上k-D Tree求k邻近 ...

  7. poj1195 Mobile phones

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 19786   Accepted: 9133 De ...

  8. 【Lintcode】177.Convert Sorted Array to Binary Search Tree With Minimal Height

    题目: Given a sorted (increasing order) array, Convert it to create a binary tree with minimal height. ...

  9. PageMethods

    主要是用到ScriptManger,老知识Mark一下,ScriptManager要EnablePageMethods="true" 后台 using System.Web.Scr ...

  10. uC/OS-II源码分析(二)

    在真正开始分析源代码前,先来看使用uC/OS-II的三个例子 1)使用信号量 #define  TASK_STK_SIZE                 512       /* 每个任务堆栈的大小 ...