在C++17中,std::variant引入了一个类型安全的多重联合容器,允许在单个变量中存放多种可能类型之一。相比传统的union,std::variant提供了完整的类型检查、异常安全以及对对象生命周期的自动管理。以下内容将从使用场景、基本语法、访问方式以及常见陷阱四个方面展开。
1. 使用场景
- 有限状态机:当对象只能处于若干离散状态之一时,std::variant能准确描述这种限制。
- 异构容器:需要在同一个容器中存储不同类型的数据,例如JSON解析后的值、数据库查询结果等。
- 函数返回多种可能类型:例如文件读取可能返回字符串、错误码或其他结构,std::variant可将其统一返回。
2. 基本语法与构造
#include <variant>
#include <string>
#include <iostream>
#include <vector>
using Result = std::variant<std::string, int, std::vector<int>>;
Result get_value(bool flag) {
if (flag)
return std::string("Hello");
else
return 42;
}
- 定义:
std::variant<Ts...>声明可容纳类型Ts的实例。 - 默认构造:会默认构造第一个类型(若未显式给定),但需注意其是否有默认构造函数。
- 构造:使用对应类型的值即可,或使用 `std::in_place_index_t ` 指定索引。