std::variant 与 std::visit

std::variant

简介

std::variant 是c++17 引入的一个类型,其作用类似于C语言中的Union,但是比Union 的功能强大的多。
C语言中一个联合体Union 可以储存多种类型数据,但缺点有很多。比如:
1 没有可用的方法来判断Union中真实储存的类型,获取值时也是内存拷贝的结果,可能会存在问题。这就只能靠程序员人脑保证获取的值是有意义的。
2 只能储存基础数据类型,不能储存其他结构体

使用 std::variant

声明一个variant对象很容易,我们可以利用std::variant 和 std::vector 将不同类型的数据放到一起,形成类似弱类型语言的效果 (例如javascript),这一点将非常有用。

#include <variant>

   using value = std::variant<int, double, bool, std::string>;
   std::vector<value> values = {
   0, true, 3.1415926,"hello"};

如何取出一个std::variant对象的值呢?
有一系列的方法判断一个 std::variant 对象的类型, 例如

  1. index() 方法, 返回 variant 对象类型index,
    当一个std::variant 对象没有被初始化的时候,会发生什么呢?会默认按照第一个类型进行初始化,那如果第一个类型没有默认的构造函数会怎么样呢?编译器会报错,为了解决这个问题,std::引入了 std::monostate 作为占位的类型。也可以使用它来替代一部分 std::optional 的功能。

  2. holds_alternative<> 判断 variant 是否是某种特定类型

  3. std::get<> 方法获取类型的值,类型不正确会抛exception,模板参数可以是类型,也可以是 index值, 但必须是常量值,因为模板是编译期推断

  4. std::get_if<> 推荐使用的方法,大部分c++项目都是禁止try- catch 的,因此无异常版本更加实用。
    该方法在类型不正确会返回空,输入和输出都是指针类型


#include <variant>

using value = std::variant<int, double, bool, std::string>;
value = "hello, world";
std::cout<<value.index()<<std::end;  //3, index 从0 开始

std::cout<<std::holds_alternative<std::string><<std::end;  //true

std::get<3>(v
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值