C++17增加了variant类型,有点像union,可以用于表示多种类型的混合体,但同一时间只能用于代表一种类型的实例。
variant提供了index成员函数,该函数返回一个索引,该索引用于表示variant定义对象时模板参数的索引(起始索引为0),同时提供了一个函数holds_alternative
#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 存放的数据类型下标为 Index,那么返回所存放的数据,否则抛出异常
2.通过get
如果变体类型 v 存放的数据类型为 T,那么返回所存放的数据,否则抛出异常
3.通过get_if
如果变体类型 v 存放的数据类型下标为 Index,那么返回所存放数据的指针,否则返回空指针
4.通过get_if
如果变体类型 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
variant d;
cout<(d)<
设置值:
设置值只需使用赋值运算符=即可,另外也可以用emplace:
1.emplace
2.emplace
#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<
上一篇:2022.11.27 学习周报
下一篇:数据结构(单链表)