C++17 std::variant:类型安全的联合体
理解variant的构造、访问和访问者模式,替代传统union和类型擦除。 · 难度:入门 · +15XP
为什么需要std::variant?
std::variant是一种类型安全的联合体,可以存储一组指定类型中的任意一个值。它避免了传统union的未定义行为和手动管理析构函数的问题。
基本用法
#include <variant>
#include <iostream>
#include <string>
int main() {
std::variant<int, double, std::string> v;
v = 42;
std::cout << std::get<int>(v) << '
';
v = 3.14;
std::cout << std::get<double>(v) << '
';
v = "Hello";
std::cout << std::get<std::string>(v) << '
';
}
访问variant
使用std::get按类型或索引访问,std::get_if返回指针,std::visit用于访问者模式。
std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, int>)
std::cout << "int: " << arg;
else if constexpr (std::is_same_v<T, double>)
std::cout << "double: " << arg;
else
std::cout << "string: " << arg;
}, v);variant方法
| 方法 | 说明 |
|---|---|
index() | 返回当前存储类型的索引 |
valueless_by_exception() | 检查是否因异常而无值 |
emplace<T>() | 原位构造 |
练习提示
创建一个std::variant<int, std::string>,然后使用std::visit编写一个lambda,如果是整数则输出其平方,如果是字符串则输出其长度。