boost数据结构variant
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;
|
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 <boost/variant.hpp> using namespace boost; class var_visitor : public static_visitor<void> union //variant class A variant<int, string> vis; cin.get(); |
参考:
浅谈boost.variant的几种访问方式
C++“准”标准库Boost学习指南(7):Boost.Variant
boost数据结构variant的更多相关文章
- boost数据结构tuple
boost数据结构tuple tuple(元组)定义了一个有固定数目元素的容器,其中每个元素类型可以不相同,这与其它容器有着本质的区别!vector和array虽然可以容纳很多元素,但是元素的类型必须 ...
- boost数据结构any(很有用!)
any是一种特殊的容器,它只能容纳一个元素,但这个元素可以是任意类型; 可以用any保存任何类型,在任何需要的时候取出它; 这种功能和shared_ptr<void>类似,但是 ...
- boost总结之variant
boost的variant库类似于联合体,但是联合体中只能接受POD类型,但variant中并无此限制,它可以接受任意的类型. boost::variant <int, std::strin ...
- 浅谈boost.variant的几种访问方式
前言 variant类型在C++14并没有加入,在cppreference网站上可以看到该类型将会在C++17加入,若想在不支持C++17的编译器上使用variant类型,我们可以通过boost的va ...
- 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 ...
- boost-数据类型之auto、any、tuple、variant
1.auto.decltype auto是C++11中的关键字,它可以通过类型推导自动得到变量或对象的类型,需要注意的是auto会忽略引用,因为引用其实就代表原对象: #include <v ...
- (原创)用c++11打造好用的variant(更新)
关于variant的实现参考我前面的博文,不过这第一个版本还不够完善,主要有这几个问题: 内部的缓冲区是原始的char[],没有考虑内存对齐: 没有visit功能. 没有考虑赋值构造函数的问题,存在隐 ...
- (原创)用c++11打造好用的variant
variant类似于union,它能代表定义的多种类型,允许将不同类型的值赋给它.它的具体类型是在初始化赋值时确定.boost中的variant的基本用法: typedef variant<in ...
- (原创)发布一个C++版本的ORM库SmartDB(一)
先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...
随机推荐
- 启动loadrunner 11的controller提示试图执行系统不支持的操作(已解决)
启动loadrunner 11的controller提示试图执行系统不支持的操作 分类: loadrunner 2014-05-12 17:33 532人阅读 评论(0) 收藏 举报 win7旗舰版3 ...
- Js随机生成指定长度字符串
function a(a) { var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&q ...
- CSS3中伪类nth-child和nth-of-type区别
本篇文章由:http://xinpure.com/css3-pseudo-class-difference-between-nthchild-and-nthoftype/ 首先来看看 nth-chil ...
- 安装应用程序 报“ 997 重叠 I/O 操作在进行中”错解决办法
解决办法: 原因: Per Microsoft's blog, patch KB2918614 appears to have caused installation issues 按照微软的博客,补 ...
- 折腾docker安装笔记
最近尝试把netcore迁移到docker,然后在本地虚拟机尝试装下 发现yum安装好复杂 于是记录下 1.7.2 centos的ios装虚拟机 2.修改网络 配置文件 查看网络地址 然后xshell ...
- window.print
function contentPrint(contentArea) { var initBody = document.body.innerHTML; if ($("div"). ...
- atitit.项目设计模式---ioc attilax总结
atitit.项目设计模式---ioc attilax总结 1. .IOC的之前 1 2. ioc后的实现 1 3. 认识引入IOC框架的缺点, 2 4. 自己实现ioc 3 4.1. ioc框架的实 ...
- netty4.1.32 pipeline的添加顺序和执行顺序
本文只想讨论一下pipeline的执行顺序问题,因为这个搞不明白就不知道先添加编码还是解码,是不是可以混淆添加等等一系列事情 pipeline.addLast(new outboundsHandler ...
- python学习之logging模块
Logger.setLevel(level) 设置记录器的级别为level.低于该级别的信息将被忽略. 记录器默认级别为NOTSET.如果记录器是根记录器,则默认将记录所有信息: 如果是一个非根记录器 ...
- nyoj 742 子串和再续 类似 HDU 1024
子串和再续 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个序列 S1, S2, S3, S4 ... Sx, ... Sn (1 ≤ x ≤ n ≤ 1,000 ...