std::variant代表了类型安全的union类型,与union类似,std::variant的一个实例要么存储了可选类型中的一个值,要么没有存储。但与union比,其优势是可以判断当前真实的存储类型并且可以存储结构体这种复杂的数据结构。下面直接给一个实例:

#include <variant>
#include <string>
#include<cassert>
#include<iostream>
int main() {// 定义两个variant类型实例std::variant<int, float> v, w;v = 18;// index 可以判断实际对应的类型,,默认第一种类型。std::cout << "Corresponding type is " << w.index() << std::endl;int i = std::get<int>(v);std::cout << "value is " << i << std::endl;w = std::get<int>(v);w = std::get<0>(v); // 与上一行功能相同w = v; // 与上一行功能相同// 类型对不上会抛出异常try {std::get<float>(w);}catch (const std::bad_variant_access& ex) {std::cout << ex.what() << std::endl;}// 避免使用 try catch,可以使用get_iffloat* fres = std::get_if<float>(&v);if (fres) {std::cout << "float value is " << *fres << std::endl;}else {std::cout << "does not contain a value" << std::endl;}v = 1.23f;fres = std::get_if<float>(&v);if (fres) {std::cout << "float value is " << *fres << std::endl;}else {std::cout << "does not contain a value" << std::endl;}// index 可以判断实际对应的类型std::cout << "Corresponding type is " << w.index() << std::endl;// holds_alternative 判断当前是否使用此类型if (std::holds_alternative<float>(v)) {std::cout << "now using float type" << std::endl;}else {std::cout << "not using float type" << std::endl;}return 0;
}

执行结果如下:

Corresponding type is 0
value is 18
bad variant access
does not contain a value
float value is 1.23
Corresponding type is 0
now using float type

可以看到查用的函数,get可以获取指定类型的数据,如果当前存储的不是此类型则会抛异常,为了解决此问题可以catch此异常,或者使用get_if通过判断指针是否为空来获取,holds_alternative可以用来判断当前是否存储的是该类型数据。

C++17类型std::variant介绍相关推荐

  1. C++17之std::variant

    从C中采用的c++提供了对union的支持,union是能够保存可能类型列表之一的对象.但是,这种语言特性也有一些缺点: 对象不知道它们当前持有的值的类型. 由于这个原因,您不能有non-trivia ...

  2. c++17 std::variant

    c++17 std::variant 说明 代码 输出 参考 说明 类模板 std::variant表示一个类型安全的联合体. std::variant 的一个实例在任意时刻要么保有其一个可选类型之一 ...

  3. Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)...

    来源:http://blog.csdn.net/xiongmao000738/article/details/6863988 一.变体类型常用的函数介绍: Variant: 一种可以拥有各种数据类型: ...

  4. C++ std::any、std::variant和std::optional的原位构造(In-Place Construction)

    本文翻译自 Bartlomiej Filipek 的博客文章 In-Place Construction for std::any, std::variant and std::optional,翻译 ...

  5. 【C++ 泛型编程 高级篇】 C++ 17 解析std::apply 的多种应用场景

    目录标题 1. 引言 1.1. C++17标准的引入 1.2. std::apply的基本概念 2. std::apply的基本用法 2.1. std::apply的函数签名 2.2. std::ap ...

  6. std::variant 与 std::visit

    std::variant 简介 std::variant 是c++17 引入的一个类型,其作用类似于C语言中的Union,但是比Union 的功能强大的多. C语言中一个联合体Union 可以储存多种 ...

  7. 【C++ 泛型编程 进阶篇】C++ 元模板推导函数调用的结果类型 std::result_of/std::invoke_result全面教程

    目录标题 1. 引言 1.1 `std::result_of`和`std::invoke_result`的简介 2. 深入std::result_of和std::invoke_result 2.1 深 ...

  8. c++ advanced(8) std::variant from beginner to expert

    目录 std::variant(c17) questions and existing problems variant: and VS or Why not Union Solution varia ...

  9. input:file上传类型控制简单介绍

    <input type="file">可以上传文件,这个就不用多介绍了. 其实我们使用此控件可以进行上传文件格式的控制. 特别说明:在实际应用中,不但要在前端进行验证, ...

最新文章

  1. PHP在使用正则表达式验证,防注入的时候要注意一下的细节
  2. MFC,ADO方式实现数据库操作
  3. arttemplate 不转义html,使用artTemplate模板引擎渲染错误
  4. nacos 配置_阿里巴巴 Nacos 分布式配置中心原理
  5. springboot-springmvc响应json与xml原理-详解数据响应与内容协商(长文预警,收藏慢啃)
  6. JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited)
  7. 第四次作业:个人项目-小学四则运算 “软件”之初版
  8. 【loj3120】【CTS2019】珍珠
  9. 广州计算机应用能力考试,2017年广州职称计算机考试报名时间和科目
  10. ELK下Kibana性能调优
  11. 全国各地 DNS 服务器 IP 总汇
  12. python实现微信自动发信息软件_Python实现给微信好友自动发送消息的示例
  13. Jsoup爬虫小案例
  14. 国家知识产权局 下载专利全文
  15. nginx代理出现Provisional headers are shown
  16. oracle的alter table,Oracle ALTER TABLE语句
  17. 领扣LintCode算法问题答案-1485. 圣杯咒语
  18. 哈夫曼树的构造与哈夫曼编码
  19. 解决网盘下载速度慢的问题
  20. gpg: keyserver timed out

热门文章

  1. 资深研发真实编写的骚注释,你学废了么?
  2. adb概览及协议参考
  3. CorelDRAWX4的C++插件开发(四十三)VBA的错误返回机制
  4. 自然语言处理数据集收集
  5. FreeSWITCH 智能呼叫流程设计
  6. 39张IoT传感器工作原理GIF动图汇总
  7. 基于javaweb房屋租赁管理系统的设计与实现
  8. 杰理之通话有噪声或者电流声【篇】
  9. 实现学生信息的多关键字排序
  10. 计算机专业实训主要内容,计算机专业的实习内容怎么写