std::variant

来自cppreference.com
< cpp‎ | utility
定义于头文件 <variant>
template <class... Types>
class variant;
(C++17 起)

类模板std::variant表示一个类型安全的联合体std::variant的一个实例在任意时刻要么保有其一个可选类型之一的值,要么不保有值(此状态难以述以档案,见valueless_by_exception)。

同联合体,若一个变量保有某个对象类型T的值,则T的对象表示被直接分配于variant的对象表示之中。不允许variant分配额外的(动态)内存。

variant不容许保有引用、数组,或类型void。空variant亦为病态(可用std::variant<std::monostate>代替)。

variant容许保有同一类型多于一次,而且可保有同一类型的不同cv资格版本。

同联合体,默认初始化的variant保有其首个选项的值,除非该选项不是可默认构造的(在此情况下默认造函数不会通过编译:帮助类std::monostate可用于令这种variant可默认构造)。

目录

[编辑] 模板参数

Types - 可存储于此variant中的类型。所有类型必须是(可有cv资格的)非数组对象类型。

[编辑] 成员函数

构造variant对象
(公开成员函数) [编辑]
析构variant,与其所容纳的值一同
(公开成员函数) [编辑]
variant赋值
(公开成员函数) [编辑]
观察器
返回variant所保有可选项的零基下标
(公开成员函数) [编辑]
检查variant是否在非法状态
(公开成员函数) [编辑]
修改器
原位构造variant中的值
(公开成员函数) [编辑]
与另一个variant交换
(公开成员函数) [编辑]

[编辑] 非成员函数

(C++17)
以一或多个variant所保有的参数的调用提供的函数对象
(函数模板) [编辑]
检查给定类型在variant中是否准确出现一次
(函数模板) [编辑]
读取variant给定下标或类型的值(若类型唯一),错误时抛出异常
(函数模板) [编辑]
(C++17)
获取指向所指variant的给定下标或类型(若类型唯一)的值的指针,错误时返回空指针
(函数模板) [编辑]
以其容纳的值比较variant对象
(函数模板) [编辑]
特化 std::swap 算法
(函数) [编辑]

[编辑] 帮助类

(C++17)
用作非可默认构造类型的variant的首个可选项的占位符类型
(类) [编辑]
variant的值非法访问时抛出的异常
(类) [编辑]
在编译时获得variant可选项列表的大小
(类模板) (变量模板) [编辑]
在编译时获得以其下标指定的可选项的类型
(类模板) (别名模板) [编辑]
特化std::hash算法
(类模板特化) [编辑]
特化std::uses_allocator类型特性
(类模板特化) [编辑]

[编辑] 帮助对象

非法状态的variant的下标
(常量) [编辑]

[编辑] 示例

#include <variant>
#include <string>
 
int main()
{
    std::variant<int, float> v, w;
    v = 12; // v容纳int
    int i = std::get<int>(v);
    w = std::get<int>(v);
    w = std::get<0>(v); // 与前一行效果相同
    w = v; // 与前一行效果相同
 
//  std::get<double>(v); // 错误:[int, float]中无double
//  std::get<3>(v);      // 错误:合法下标为0和1
 
    try {
      std::get<float>(w); // w容纳int,非float:将抛出异常
    }
    catch (std::bad_variant_access&) {}
 
    std::variant<std::string> v("abc"); // 转换构造函数在无歧义时有效
    v = "def"; // 转换赋值在无歧义时亦有效
}


[编辑] 参阅

原位构造标签
(类模板) [编辑]
(C++17 起)
可能或可能不保有一个对象的包裹器
(类模板) [编辑]
(C++17 起)
保有任何可复制构造CopyConstructible)类型实例的对象。
(类) [编辑]