C++(17):variant
创始人
2024-02-20 17:03:10
0

C++17增加了variant类型,有点像union,可以用于表示多种类型的混合体,但同一时间只能用于代表一种类型的实例。

variant提供了index成员函数,该函数返回一个索引,该索引用于表示variant定义对象时模板参数的索引(起始索引为0),同时提供了一个函数holds_alternative(v)用于查询对象v当前存储的值类型是否是T:

#include 
#include 
#include 
using namespace std;int main(){variant d;cout<(d)<(d)<(d)<

构造:

有几点需要注意:

1.variant不能使用空变量、具有引用成员的变量、具有c样式数组成员的变量和具有不完整类型(如void)的变量。

2.variant构造时,如果没有指明类型,会用第一个类型(索引为0的类型)的默认构造函数进行构造(如上例中对象d),因此第一个类型必须具有默认构造函数。如果没有合适的类型,可以使用帮助类型monostate作为第一个类型。

3.构造时如果初始化值可以匹配到多个类型,那么会编译错误:

variant d{8};    //编译错误

 可以使用in_place_index指明类型:

variant d{in_place_index<1>, 66};    //指明初始化第一个类型
cout<

读取值:

1.通过get(v)

如果变体类型 v 存放的数据类型下标为 Index,那么返回所存放的数据,否则抛出异常

2.通过get(v)

如果变体类型 v 存放的数据类型为 T,那么返回所存放的数据,否则抛出异常

3.通过get_if(&v)

如果变体类型 v 存放的数据类型下标为 Index,那么返回所存放数据的指针,否则返回空指针

4.通过get_if(&v) 

如果变体类型 v 存放的数据类型为 T,那么返回所存放数据的指针,否则返回空指针

#include 
#include 
#include 
using namespace std;int main(){variant d{8};cout<(d)<(d)<(d)<(d)<(d)<(&d);if(a1){cout<<*a1<(&d);if(a2){cout<<*a2<

需要注意的是,如果设定variant模板类型时,有多个相同的类型,那么get货get_if会报编译错误,因为可以匹配到多个模板类型,此时可以使用get或get_if进行读取:

variant d;
cout<(d)<

设置值:

设置值只需使用赋值运算符=即可,另外也可以用emplace:

1.emplace()         指明使用类型T为对象分配一个新值

2.emplace()      指明使用索引Idx为对象分配一个新值

#include 
#include 
#include 
using namespace std;int main(){variant d{8};cout<(3.14);cout<("hi");cout<

在设置值时会完成对象的构造和析构,也就是说variant是基于值的传递,其成本还是较高的:

#include 
#include 
using namespace std;class A{
public:A(){ cout<<"A construct, this:"< d;cout<

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...