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中存的不同类型,进行不同的操作
   }
}

原文地址:https://www.cnblogs.com/logchen/p/10224849.html

时间: 2024-10-11 21:56:55

Boost--variant (C++中的union)的相关文章

boost::tie()和boost::variant()讲解

#include<iostream> #include<boost/tuple/tuple.hpp> #include<boost/variant.hpp> #include<boost/tuple/tuple_io.hpp> #include<boost/any.hpp> #include<vector> #include<iterator> #include<string> using namespace

SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题

原文:SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题 本文出处:http://www.cnblogs.com/wy123/p/7884986.html 周围又有人在讨论UNION和UNION ALL,对于UNION和UNION ALL,网上说的最多的就是性能问题(实在不想说出来这句话:UNION ALL比UNION快)其实根本不想炒UNION和UNION ALL这碗剩饭了,每次看到网上说用这个不用那个,列举的一条一条的那种文章,只要看到说U

Sql中的union和union all的讲解

SQL UNION 和 UNION ALL操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须相同. 假设我们有一个表Student,包括以下字段与数据: drop table student; create table student(id int primary key,name nvarchar2(50) not null,s

SQL中的union

在SQL中,如果我们查询一个班级的考试成绩数据,再统计考试成绩的总和,我们使用以下两条语句: select StudentName,Grade from Student select '总成绩',SUM(Grade)from Student 执行此两条代码,结果会分别显示在两个表中,我们该如何使两条数据整合在一起?这就用到了union集合运算符,union对两个集合进行操作,两个集合需要有相同的列名,两个集合的列类型应该是相符的,最终列名以第一个集合列名为准. 我们上面的代码片段恰好符合合并的要

[转]C#Linq中的Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods,skip,take,takewhile,skipwhile,编译查询等

本文转自:http://www.cnblogs.com/suizhikuo/p/3791799.html 我们继续讲解LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union All/Union/Intersect操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1.简单形式:

C++ 中的union

union myun { struct { int x; int y; int z; }u; int k; }a; int main() { a.u.x =4; a.u.y =5; a.u.z =6; a.k = 0; printf("%d %d %d\n",a.u.x,a.u.y,a.u.z); return 0;//输出 0,5,6 } union类型是共享内存的,以size最大的结构作为自己的大小,这样的话,myun这个结构就包含u这个结构体,而大小也等于u这个结构体 的大小,在

sql中的union,except及intersect

1.union: 使用union:组合两个结果表,消除重复的记录. 使用union all:组合两个结果表(重复不去重). 2.except: 使用except:在table1中但不在table2中的行,同时消除重复行. 使用except all:不消除重复行. 3.intersect: 获取两个结果集的并集. 版权声明:本文为博主原创文章,未经博主允许不得转载.

Check类中的union,excl,diff,intersect

定义一些类,这些类之间有父子关系,如下: class Father{} class Son1 extends Father{} class Son2 extends Father{} class Top{} class Middle extends Top{} class Bottom extends Middle{} 1.incl()方法 源代码如下: /** Add type set to given type list, unless * it is a subclass of some

Java中的Union Types和Intersection Types

前言 Union Type和Intersection Type都是将多个类型结合起来的一个等价的"类型",它们并非是实际存在的类型. Union Type Union type(联合类型)使用比特或运算符|进行构造: A | B | C 注意:用|符号来构造Union Type类型只是Java语言的规定,|在这里不代表比特或的含义. 上例中,A | B | C是一个Union type,Union type的含义就是"或",只要满足其中一个即可. 实例:捕获多个异常