variant和any有些类似,是一种可变类型,是对C/C++中union概念的增强和扩展;
    普通的union只能持有普通数据类型,而不能持有string、vector等复杂类型,而variant则可以;
    variant接口和any类似,但它是一个模板类;
    variant的默认构造函数通过模板中的第一个类型(严格地说,为bounded type)进行构造;
    如果模板中的第一个类型不存在默认构造,将会报错,哪怕后续类型存在默认构造;
    第一个模板类型不存在默认的构造函数,variant对象可直接通过模板中的任意类型的构造函数的方式得以构造;
    一个variant对象也可通过模板中的任意类型的构造函数进行赋值;
    有两种方式获取 variant对象中的内容:  apply_visitor,安全且强大;    get<T>,十分方便
    get<T>方法存在一个显著的缺陷,如果一个函数接受variant<int, string>,我们无法知道传递进来的variant对象,是int类型还是string类型;
    在实际应用中,对variant类型对象内容的获取需要一个比get方法更为鲁棒的获取机制,这正是安全且强大的apply_visitor;

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
 
/* boost_variant.cpp
    variant和any有些类似,是一种可变类型,是对C/C++中union概念的增强和扩展;
    普通的union只能持有普通数据类型,而不能持有string、vector等复杂类型,而variant则可以;
    variant接口和any类似,但它是一个模板类;
    variant的默认构造函数通过模板中的第一个类型(严格地说,为bounded type)进行构造;
    如果模板中的第一个类型不存在默认构造,将会报错,哪怕后续类型存在默认构造;
    第一个模板类型不存在默认的构造函数,variant对象可直接通过模板中的任意类型的构造函数的方式得以构造;
    一个variant对象也可通过模板中的任意类型的构造函数进行赋值;
    有两种方式获取 variant对象中的内容:  apply_visitor,安全且强大;    get<T>,十分方便
    get<T>方法存在一个显著的缺陷,如果一个函数接受variant<int, string>,我们无法知道传递进来的variant对象,是int类型还是string类型;
    在实际应用中,对variant类型对象内容的获取需要一个比get方法更为鲁棒的获取机制,这正是安全且强大的apply_visitor;
*/

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

#include <boost/variant.hpp>

using namespace boost;
using namespace std;

class var_visitor : public static_visitor<void>
{
public:
    template<typename T>
    void operator()(T& i) const
    {
        cout << i << endl;
    }
};
int main(void)
{
    //union
    union 
    {
        int i; 
        int d;
    } u;
    u.d = ;
    u.i = ;                                        // overwrites u.d

union
    {
        int i;
        //string s;                                 // illegal: string is not a POD type!
    }uu;

//variant
    variant<int, string> v;                       // 初始状态下,v被初始化为int(0)
    cout << v.type().name() << endl;          // int
    cout << v << endl;                            // 0

class A
    {
    public:
        A(int){}
    };
    //variant<A, int> va;                            // 第一个参数A不存在默认构造,报错!
;
    variant<A, );

variant<int, string> vis;
    vis = "Michael";
    
    //获取值
    string& str = boost::get<string>(vis);
    str += " Joessy! ";
    cout << str << endl;
    
    variant<int, string> vvv;
    vvv = "Hello world";  
    apply_visitor(var_visitor(), vvv);

cin.get();
    ;
}

参考:

浅谈boost.variant的几种访问方式

C++“准”标准库Boost学习指南(7):Boost.Variant

boost数据结构variant的更多相关文章

  1. boost数据结构tuple

    boost数据结构tuple tuple(元组)定义了一个有固定数目元素的容器,其中每个元素类型可以不相同,这与其它容器有着本质的区别!vector和array虽然可以容纳很多元素,但是元素的类型必须 ...

  2. boost数据结构any(很有用!)

    any是一种特殊的容器,它只能容纳一个元素,但这个元素可以是任意类型;    可以用any保存任何类型,在任何需要的时候取出它;    这种功能和shared_ptr<void>类似,但是 ...

  3. boost总结之variant

    boost的variant库类似于联合体,但是联合体中只能接受POD类型,但variant中并无此限制,它可以接受任意的类型.   boost::variant <int, std::strin ...

  4. 浅谈boost.variant的几种访问方式

    前言 variant类型在C++14并没有加入,在cppreference网站上可以看到该类型将会在C++17加入,若想在不支持C++17的编译器上使用variant类型,我们可以通过boost的va ...

  5. Using Boost Libraries in Windows Store and Phone Applications

    Using Boost Libraries in Windows Store and Phone Applications RATE THIS Steven Gates 18 Jul 2014 5:3 ...

  6. boost-数据类型之auto、any、tuple、variant

    1.auto.decltype   auto是C++11中的关键字,它可以通过类型推导自动得到变量或对象的类型,需要注意的是auto会忽略引用,因为引用其实就代表原对象: #include <v ...

  7. (原创)用c++11打造好用的variant(更新)

    关于variant的实现参考我前面的博文,不过这第一个版本还不够完善,主要有这几个问题: 内部的缓冲区是原始的char[],没有考虑内存对齐: 没有visit功能. 没有考虑赋值构造函数的问题,存在隐 ...

  8. (原创)用c++11打造好用的variant

    variant类似于union,它能代表定义的多种类型,允许将不同类型的值赋给它.它的具体类型是在初始化赋值时确定.boost中的variant的基本用法: typedef variant<in ...

  9. (原创)发布一个C++版本的ORM库SmartDB(一)

    先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...

随机推荐

  1. Android Exception 7(attempt to re-open an already-closed object )

    07-23 18:16:17.641: W/SQLiteConnectionPool(28390): A SQLiteConnection object for database '/storage/ ...

  2. hibernate list和iterate

    list方法会一次查出所有内容,放在list里和缓存中.再次查询同一内容仍然会去数据库重新查一遍,并刷新缓存. iterate方法会一次查出所有内容的ID,等用到某个ID对应的内容时又会去根据主键查询 ...

  3. 0基础的小白怎么学习Java?

    自身零基础,那么我们应该先学好Java,首先我们来了解下Java的特性: Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java.另一方面,Jav ...

  4. Tcp Ip -- tcpdump win窗口大小

    问题介绍 今天,有内部模块与外部系统断连. (外部系统smgw,内部接口interface) smgw <----> interface 有消息交互. 通过tcpdump -xns0 po ...

  5. 简单的刚開始学习的人配置Android SDK+ADT+Eclipse

    1.下载JDK.Android SDK和Eclipse(Eclipse 版本号最好新一些) 注意:下载的SDK最好和后面的ADT配套,否则Eclipse可能会报错. 如:SDK 21.0.1 相应 A ...

  6. XML 实体扩展攻击libxml_disable_entity_loader

    XML 实体扩展攻击libxml_disable_entity_loader https://pay.weixin.qq.com/index.php/public/cms/content_detail ...

  7. NFC Basics(基本NFC)——翻译自developer.android.com

    NFC Basics 关于收发NDEF格式的消息,以及相关的api. 非NDEFdata以及其它更深入技术请參见Advanced NFC. 在android端使用NDEF有两种情况: - 从标签读取N ...

  8. Atitit.木马病毒的操作注册表原理 系统服务管理器 atiSysService

    Atitit.木马病毒的操作注册表原理 系统服务管理器 atiSysService 1. atiSysService1 2. atiSysService  原理1 3. Java code1 4. 参 ...

  9. Decoration1:Spring-boot基础实现

    前段时间发布的Traveller项目,花费了不少精力,但是效果并不如意,根源在于瀑布式的开发思想不适合这种独立的学习项目.在项目初始就规划一个全面的web系统,,因为预设了一个前景,在心理上会想尽快看 ...

  10. mysql之内存表

    一.引言 昨天下午老大让我查资料看一下mysql的内存表在主从备份中是否能被复制,我还没听说过内存表呢,于是上网查资料,记录一下,以便查阅.学习 二.进展 参考: http://www.cnblogs ...