std::variant是C++17引入的类型安全联合体,能存储多种类型之一并自动跟踪当前类型。通过std::get按类型访问值,错误访问会抛出异常;推荐使用std::get_if进行安全检查或std::visit结合lambda实现类型分发。适用于配置解析、状态机等场景,避免继承开销,不支持引用、数组和void,可用std::monostate表示空状态。

在C++17之前,union虽然可以节省内存,但缺乏类型安全性——程序员需要手动管理当前存储的是哪种类型,否则容易引发未定义行为。std::variant的出现解决了这个问题,它提供了一个类型安全的“可变类型”容器,能在一个对象中存储多种类型之一,并自动跟踪当前活跃类型。
std::variant是C++17引入的模板类,位于variant头文件中。它像一个受控的union,只能保存其模板参数列出的某一种类型的值。与原始union不同,std::variant知道当前保存的是哪个类型,避免了类型误读的风险。
例如,声明一个可以保存int、double或string的variant:
#include此时v默认初始化为第一个类型int的默认值(即0)。
立即学习“C++免费学习笔记(深入)”;
直接获取值有几种方式,最常用的是std::get和std::visit。
v = 3.14; // 存入double
double d = std::get
如果尝试用错误的类型获取值,比如std::get
更推荐的方式是使用std::visit,它支持对variant进行类型安全的函数调用,尤其适合处理多个可能类型的情况。
std::visit接受一个可调用对象(如lambda)和一个或多个variant,自动根据当前类型调用对应的处理逻辑。
std::visit([](const auto& value) {
std::cout
}, v);
上面的泛型lambda会针对variant当前的实际类型实例化一次。也可以写具体的重载来区分处理:
struct Printer {
void operator()(int i) const { std::cout
void operator()(double d) const { std::cout
void operator()(const std::string& s) const { std::cout
};
std::visit(Printer{}, v);
std::variant常用于解析配置、表达式求值、状态机设计等需要“多态但非继承”的场合。相比继承体系,它更轻量且避免虚函数开销。
注意点:
基本上就这些。std::variant让C++中的类型联合变得安全又直观,配合std::visit能写出清晰的类型分支逻辑,是现代C++值得掌握的工具。
以上就是c++++如何使用variant实现类型安全的union_c++17新特性std::variant的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号