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