C++17增加std::variant实现类似union的功能,但却比union更高级,举个例子union里面不能有string这种类型,但std::variant却可以,还可以支持更多复杂类型,如map等。

注意,不允许使用空变量、具有引用成员的变量、具有c样式数组成员的变量和具有不完整类型(如void)的变量。没有空的状态:这意味着对于每个构建的对象,必须至少调用一个构造函数。默认构造函数初始化第一个类型(通过第一个类型的默认构造函数):

1.默认情况下,变量的默认构造函数调用第一个备选项的默认构造函数:

2.成员函数index()可用于查明当前设置了哪个选项(第一个选项的索引为0)。

3.访问值的通常方法是调用get<>()获取对应的选项值。可以传递它的索引或者类型

#include <variant>
 
std::variant<int, std::string> var{"hi"}; // initialized with string alternative
std::cout << var.index(); // prints 1
var = 42; // now holds int alternative
std::cout << var.index(); // prints 0

var = "world";
...
try {
std::string s = std::get<std::string>(var); // access by type

std::cout << s << std::endl;   //world

var = 3;
int i = std::get<0>(var); // access by index

std::cout << i << std::endl;   //3
}
catch (const std::bad_variant_access& e) { // in case a wrong type/index is used

如果没有为第一个类型定义默认构造函数,则调用该变量的默认构造函数会在编译时错误:
#include <iostream>
#include <variant>
 
struct NoDefConstr
{
    NoDefConstr(int i)
    {
        std::cout << "NoDefConstr::NoDefConstr(int) called\n";
    }
};
 
int main()
{
    std::variant<NoDefConstr, int> v1; // ERROR: can’t default construct first type
 
    return 0;

不过辅助类型std::monostate提供了处理这种情况的能力,还提供了模拟空状态的能力。

std::monostate
为了支持第一个类型没有默认构造函数的variant对象,提供了一个特殊的helper类型:std::monostate。类型std::monostate的对象总是具有相同的状态,因此,它们总是相等的。它自己的目的是表示另一种类型,这样variant就没有任何其他类型的值。也就是说,std::monostate可以作为第一种替代类型,使变体类型默认为可构造。

std::variant<std::monostate, NoDefConstr> v2; // OK
std::cout << "index: " << v2.index() << '\n'; // prints 0

4.赋值和emplace()操作对应于初始化:

std::variant<int, int, std::string> var; // sets first int to 0, index()==0
var = "hello"; // sets string, index()==2
var.emplace<1>(42); // sets second int, index()==1

c++ 17 std::variant相关推荐

  1. c++17 std::variant

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

  2. C++17类型std::variant介绍

    std::variant代表了类型安全的union类型,与union类似,std::variant的一个实例要么存储了可选类型中的一个值,要么没有存储.但与union比,其优势是可以判断当前真实的存储 ...

  3. C++17之std::variant

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

  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. std::variant 与 std::visit

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

  6. 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 ...

  7. C++(17):variant

    C++17增加了variant类型,有点像union,可以用于表示多种类型的混合体,但同一时间只能用于代表一种类型的实例. variant提供了index成员函数,该函数返回一个索引,该索引用于表示v ...

  8. 访问boost::variant std::variant

    std::visit 定义于头文件 <variant>     template <class Visitor, class... Variants> constexpr /* ...

  9. C++17之std::visit

    它们必须明确地为每种可能的类型提供函数调用操作符.然后,使用相应的重载来处理当前的备选项类型. 1. 使用对象函数方式访问 例1: #include <iostream> #include ...

  10. C ++ 17中有哪些新功能?

    C ++ 17现在功能齐全,因此不太可能经历大的变化. 为C ++ 17提出了数百个提案. 在C ++ 17中,哪些特性被添加到C ++中? 当使用支持"C ++ 1z"的C ++ ...

最新文章

  1. Oracle数据库之过滤和排序
  2. 分布式锁与实现(一)——基于Redis实现
  3. openresty package.path require 报错
  4. 制造爆款:建立“增长团队”
  5. Java-GuardedBlocks与BusyWaitting忙等待
  6. [转载] Numpy 使用教程--Numpy 数学函数及代数运算
  7. OC 内存管理之手动内存管理MRC
  8. 最新最全论文合集——基于机器学习/深度学习的睡眠信号分类
  9. Java根据出生日期计算(判断)星座
  10. AutoCAD Civil 3D中的对象和标签
  11. Scrapy框架爬取下载王者荣耀英雄壁纸
  12. 基于SGIP协议的短信网关接口
  13. Tektronix TBS1102B 示波器
  14. 水处理离子交换设备详解
  15. HashTab 2.08 简体中文版
  16. Log sum inequalit 对数和不等式的证明
  17. 宝宝头上有一圈不长头发
  18. 工具篇——1、TMUX
  19. java没思路_Java编程没思路写不出代码怎么办
  20. AutoIt3(au3)源码-字符转换工具

热门文章

  1. 一、Java语言基础(5)_数组高级——方法参数的值传递机制
  2. homebrew osx下面最优秀的包管理工具
  3. 【Java学习笔记之三】java中的变量和常量
  4. IScroll5 参数说明和调用方法
  5. chkconfig命令详解
  6. Hibernate存取JSON数据
  7. React开发中常见问题和 Warning
  8. uni-app 更改默认组件样式
  9. win10右下角的天气怎么关闭
  10. PHP接口报错:500服务器错误