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. kde Plasmoid Applet开发
  2. 手把手带你领略双十一背后的核心技术Sentinel之服务的熔断降级
  3. vue-router 按需加载
  4. install python_python install on windows 10
  5. oracle varchar2转date_5分钟学会精算师常用Oracle语句
  6. JSON与Delphi Object的互换
  7. 我的内核学习笔记15:海思Hi3516平台GPIO使用记录
  8. 在线JSON格式化工具
  9. 单例设计模式共享数据分析、解决,call_once
  10. vue项目中遇到的问题总结
  11. PE框架学习之道:PE框架——style的配置
  12. 地铁工程建设应急管理平台专业数据CAD制图
  13. 关于H5调用摄像头麦克风的权限问题
  14. 手机、电话号码、邮箱、域名、身份证号的测试用例
  15. 毕业论文参考文献格式设置(以GB/T 7714-2015为例)
  16. 第一讲:摄影和记录的区别(照相机摄影和手机摄影的区别)
  17. spring+vue前后端端分离上传图片到后台静态资源目录(适合个人小项目)
  18. Win10卸载KB5014699补丁教程
  19. STL容器之vector
  20. 优动漫PAINT是什么?有哪些功能和特色

热门文章

  1. 感谢那些打赏赞助过我的人
  2. redis安装部署(1)
  3. WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体
  4. linux将分区从目录上卸载,Linux CentOS 硬盘分区、格式化、挂载与卸载
  5. java正则表达式 提取 host_使用正则表达式获取链接的Host
  6. opensaml2.0 java例子_OpenSAML 使用引导 I : 简介——关于OpenSAML你所需知道的一切
  7. python rabitmq_python中RabbitMQ的使用(安装和简单教程)
  8. 10分钟学会写一个简单的Mysql存储过程
  9. PHP根据配置的规则,计算用户的等级
  10. FreeType 使用FT_MEM_ALLOC/FT_FREE内存操作