Boost--variant (C++中的union)
union联合体类型的问题
- 只能用于内部类型,这使得union在C++中几乎没有用
所以boost提供了variant,相当于是C++中的union
#include "boost/variant.hpp"
#include <vector>
#include <iostream>
#include <array>
#include <string>
using namespace std;
class DoubleVisitor : public boost::static_visitor<> {
public:
void operator() (int& i) const {
i += i;
}
void operator() (string& str) const {
str += str;
}
};
void Double( boost::variant<int, string> u) {
}
int main()
{
// C union:
union {int i; float f;} u; // u要么包含一个int,要么包含一个float
u.i = 34;
cout << u.i << endl;
u.f = 2.3; // u.i被覆盖
cout << u.i << endl; // 输出无效的结果
// 问题:只支持内部类型
//union {int i; string s;} u; // 比如string就编译不了
// variant是C++中的union
boost::variant<int, string> u1, u2;
u1 = 2;
u2 = "Hello";
cout << u1 << endl;
cout << u2 << endl;
//u1 = u1 * 2; // variant类型没有重载*,不能直接进行操作
u1 = boost::get<int>(u1) * 2; // 使用get() 返回一个int的引用
// 如果是variant<int*, string>, get()返回int的指针
cout << boost::get<int>(u1) << endl; // output: 64
//cout << boost::get<string>(u1) << endl; // 崩。 variant是带鉴别能力的union
// 如果检索失败, get() 返回空指针或者抛出一个异常: bad_get
u1 = "good"; // u1 变成一个string
u1 = 32; // u1 变成一个int
// variant永远不会为空
boost::variant<int, string> u3;
cout << boost::get<int>(u3) << endl;
// 使用get的问题是我们并不总是知道保存在variant中的类型是什么
//这个时候可以使用visitor
// 定义仿函数,为variant的不同类型重载函数调用运算符
boost::apply_visitor( DoubleVisitor(), u1 );
cout << boost::get<int>(u1) << endl; // output: 128
boost::apply_visitor( DoubleVisitor(), u2 );
cout << boost::get<string>(u2) << endl; // output: HelloHello
std::vector< boost::variant<int, string> > arr;
arr.push_back("good");
arr.push_back(25);
arr.push_back("bad");
for (auto x : arr) {
boost::apply_visitor( DoubleVisitor(), x); //会根据variant中存的不同类型,进行不同的操作
}
}
Boost--variant (C++中的union)的更多相关文章
- boost::tie()和boost::variant()解说
#include<iostream> #include<boost/tuple/tuple.hpp> #include<boost/variant.hpp> #in ...
- boost variant
Boost Variant resembles union. You can store values of different types in a boost::variant. 1. #incl ...
- C++中使用union的几点思考(转)
C++中使用union的几点思考 大卫注:这段时间整理旧资料,看到一些文章,虽然讲的都是些小问题,不大可能用到,但也算是一个知识点,特整理出来与大家共享.与此相关的那篇文章的作者的有些理解是错误的,我 ...
- Ms SQLServer中的Union和Union All的使用方法和区别
Ms SQLServer中的Union和Union All的使用方法和区别 SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 ...
- Oracle中的Union、Union All、Intersect、Minus
Oracle中的Union.Union All.Intersect.Minus 众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包括 ...
- golang 中的 sizeof 以及 golang中的 union
golang 中的 sizeof: 1: int(unsafe.Sizeof(uint32(0))) 2: int(reflect.TypeOf(uint32(0)).Size()) golang中的 ...
- 让boost.variant支持lambda表达式访问
前言 之前写个过一篇博客叫<浅谈boost.variant的几种访问方式>,里面讲到了可以通过访问者方式来获取variant的值,但是在重载函数operator()里面只能够获取varia ...
- 浅谈boost.variant的几种访问方式
前言 variant类型在C++14并没有加入,在cppreference网站上可以看到该类型将会在C++17加入,若想在不支持C++17的编译器上使用variant类型,我们可以通过boost的va ...
- mysql中的union操作(整理)
mysql中的union操作(整理) 一.总结 一句话总结: union两侧的字段数和字段类型要是一样的 union可以接多个 orderby和排序可以在最后的union组合之后 1.union简单实 ...
随机推荐
- 矩阵快速幂 51nod
基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大,只需要输出 ...
- 2017.4.28 KVM 内存虚拟化及其实现
概述 KVM(Kernel Virtual Machine) , 作为开源的内核虚拟机,越来越受到 IBM,Redhat,HP,Intel 等各大公司的大力支持,基于 KVM 的开源虚拟化生态系统也日 ...
- Python基础练习及答案
1.请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li=['alex', 'eric', 'rain'] 该题目主要是考的字符串的拼接,join方法, s = "" li ...
- ELFhash
字符串哈希算法(以ELFHash详解) 更多字符串哈希算法请参考:http://blog.csdn.net/AlburtHoffman/article/details/19641123 先来了解一 ...
- Primitives vs Objects
这里首先我们要了解什么是primitives 和 objects 其实理解起来很简单. 如果我们懂.NET开发就会知道C#中的值类型和引用类型. primitives variables contai ...
- MatConvNet中关于vl_simplenn_display的一些分析
一.关于各层data size的分析 layer1: floor((224-7)/2)+1=109 这里7是filter大小,2是stride layer4: floor((109+0+1-3)/2 ...
- HttpServletResponse和HttpServletRequest
1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletReq ...
- 服务网关Zuul
路由+过滤器 = Zuul 核心是一系列的过滤器 Zuul的四种过滤器API 前置(PRE) 后置(POST) 路由(Route) 错误(Error) Zuul组织架构图 二.Zuul的使用 1 创建 ...
- 利用ST MCU内部基准参考电压监测电源电压及其它
在使用ST MCU开发过程中,有人问如果电源电压是变动的,询问有无办法用比较简洁的办法对电源电压进行监测,或者说电源电压波动情况下能否检测出其它待测的AD输入电压. 这里跟大家分享交流一个方法.就是在 ...
- Apache Kafka监控之KafkaOffsetMonitor
转载自:http://www.cnblogs.com/Leo_wl/p/4564699.html 1.概述 前面给大家介绍了Kafka的背景以及一些应用场景,并附带上演示了Kafka的简单示例.然后, ...