std::variant 是 C++17 引入的类型安全联合体,用于存储多种类型之一并明确当前活跃类型;声明时列出允许类型,支持直接、花括号及 in_place_type 初始化;访问需用 std::get、std::get_if 或 std::visit 确保类型安全。
std::variant 是 C++17 引入的类型安全联合体,用来在单个对象中存储多种可能类型中的一个,且能明确知道当前存的是哪种。它比传统 union 更安全,也比 void* 或手动管理类型标签更清晰。
声明时列出所有允许的类型,顺序不重要,但需满足可构造、可析构等基本要求(比如不能含引用或抽象类)。
不能像普通 union 那样直接 reinterpret_cast;必须先确认活跃类型,再获取值。推荐方式有三种:
std::visit 接收一个可调用对象(如 lambda)和一个或多个 variant。对单个 variant,lambda 需支持所有可能类型:
std::variantv = "test"; std::visit([](const auto& x) { using T = std::decay_t
; if constexpr (std::is_same_v ) { std::cout << "int: " << x << '\n'; } else if constexpr (std::is_same_v ) { std::cout << "string: " << x << '\n'; } else if constexpr (std::is_same_v ) { std::cout << "bool: " << std::boolalpha << x << '\n'; } }, v);
这种 if constexpr + visit 的组合是类型安全、零开销的多态处理方式。
运行时可随时检查 variant 状态:
注意:index() 和 holds_alternative 不保证类型安全访问,只是辅助判断,真正取值仍需 get 或 visit。
基本上就这些。std::variant 的核心是“静态类型列表 + 运行时单活跃值 + 访问前校验”,用好 visit 和 get_if 就能写出清晰又健壮的类型多态逻辑。