c++ 17 std::variant
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相关推荐
- c++17 std::variant
c++17 std::variant 说明 代码 输出 参考 说明 类模板 std::variant表示一个类型安全的联合体. std::variant 的一个实例在任意时刻要么保有其一个可选类型之一 ...
- C++17类型std::variant介绍
std::variant代表了类型安全的union类型,与union类似,std::variant的一个实例要么存储了可选类型中的一个值,要么没有存储.但与union比,其优势是可以判断当前真实的存储 ...
- C++17之std::variant
从C中采用的c++提供了对union的支持,union是能够保存可能类型列表之一的对象.但是,这种语言特性也有一些缺点: 对象不知道它们当前持有的值的类型. 由于这个原因,您不能有non-trivia ...
- C++ std::any、std::variant和std::optional的原位构造(In-Place Construction)
本文翻译自 Bartlomiej Filipek 的博客文章 In-Place Construction for std::any, std::variant and std::optional,翻译 ...
- std::variant 与 std::visit
std::variant 简介 std::variant 是c++17 引入的一个类型,其作用类似于C语言中的Union,但是比Union 的功能强大的多. C语言中一个联合体Union 可以储存多种 ...
- 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 ...
- C++(17):variant
C++17增加了variant类型,有点像union,可以用于表示多种类型的混合体,但同一时间只能用于代表一种类型的实例. variant提供了index成员函数,该函数返回一个索引,该索引用于表示v ...
- 访问boost::variant std::variant
std::visit 定义于头文件 <variant> template <class Visitor, class... Variants> constexpr /* ...
- C++17之std::visit
它们必须明确地为每种可能的类型提供函数调用操作符.然后,使用相应的重载来处理当前的备选项类型. 1. 使用对象函数方式访问 例1: #include <iostream> #include ...
- C ++ 17中有哪些新功能?
C ++ 17现在功能齐全,因此不太可能经历大的变化. 为C ++ 17提出了数百个提案. 在C ++ 17中,哪些特性被添加到C ++中? 当使用支持"C ++ 1z"的C ++ ...
最新文章
- kde Plasmoid Applet开发
- 手把手带你领略双十一背后的核心技术Sentinel之服务的熔断降级
- vue-router 按需加载
- install python_python install on windows 10
- oracle varchar2转date_5分钟学会精算师常用Oracle语句
- JSON与Delphi Object的互换
- 我的内核学习笔记15:海思Hi3516平台GPIO使用记录
- 在线JSON格式化工具
- 单例设计模式共享数据分析、解决,call_once
- vue项目中遇到的问题总结
- PE框架学习之道:PE框架——style的配置
- 地铁工程建设应急管理平台专业数据CAD制图
- 关于H5调用摄像头麦克风的权限问题
- 手机、电话号码、邮箱、域名、身份证号的测试用例
- 毕业论文参考文献格式设置(以GB/T 7714-2015为例)
- 第一讲:摄影和记录的区别(照相机摄影和手机摄影的区别)
- spring+vue前后端端分离上传图片到后台静态资源目录(适合个人小项目)
- Win10卸载KB5014699补丁教程
- STL容器之vector
- 优动漫PAINT是什么?有哪些功能和特色
热门文章
- 感谢那些打赏赞助过我的人
- redis安装部署(1)
- WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体
- linux将分区从目录上卸载,Linux CentOS 硬盘分区、格式化、挂载与卸载
- java正则表达式 提取 host_使用正则表达式获取链接的Host
- opensaml2.0 java例子_OpenSAML 使用引导 I : 简介——关于OpenSAML你所需知道的一切
- python rabitmq_python中RabbitMQ的使用(安装和简单教程)
- 10分钟学会写一个简单的Mysql存储过程
- PHP根据配置的规则,计算用户的等级
- FreeType 使用FT_MEM_ALLOC/FT_FREE内存操作