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简单实 ...
随机推荐
- 配置apache-maven-3.6.0时所遇到的坑(二)
在命令行窗口中输入:mvn -v 或 直接 mvn 时出现如下问题: The JAVA_HOME environment variable is not defined corre ...
- Blender 画正四面体
正四面体打开“添加网格”菜单(Shift + A),然后选择“锥形”.将“顶点数”设置为3,将“半径1”保留为默认值1.000,将“半径2”设置为0.000.现在,将深度设置为 {根号2,约等于1.4 ...
- 当爬虫遇到js加密
当爬虫遇到js加密 我们在做python爬虫的时候经常会遇到许多的反爬措施,js加密就是其中一种. 破解js加密的方法也有很多种: 1.直接驱动浏览器抓取数据,无视js加密. 2.找到本地加密的js代 ...
- hdu6441 Find Integer (费马大定理)
#include<bits/stdc++.h> using namespace std; int main() { int T; scanf("%d",&T); ...
- UBUNTU 安装教程
玩过linux,只是博主觉得现在的很多服务器都是linux系统的,而自己属于那种前端也搞,后台也搞,对框架搭建也感兴趣,但是很多生产上的框架和工具都是安装在服务器上的,而且有不少大公司都要求熟悉在li ...
- js语言中的新发现和一些总结
js中定义变量加var和不加var的区别 原创 2016年09月01日 10:17:33 标签: js 3658 这个问题其实我在面试的时候有被问到过,当时我记得我回答的很模糊,面试官看到我好像不太清 ...
- day43 数据库学习egon的博客 视图、触发器、事务、存储过程、函数
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- Terraform Detecting Drift
转自:https://www.terraform.io/docs/extend/best-practices/detecting-drift.html 这篇文章主要说明了对于资源如何处理 read&a ...
- 让Windows XP的键盘“说话”,全语音键盘
长期面对无声的电脑,我们难免疲倦.如果正在输入的内容被系统一字(字母)不差地念出来,你还能在无声的疲倦中输入错误的内容吗?本文以Windows 2000/XP中一个鲜为人知的“讲述人”为例,来教你DI ...
- day40 css高级选择器
一.高级选择器 高级选择器分为:后代选择器.子代选择器.并集选择器.交集选择器 后代选择器 使用空格表示后代选择器.顾名思义,父元素的后代(包括儿子,孙子,重孙子) .container p{ col ...