std::variant是C++17引入的类型安全联合体,可持有多种类型之一并记录当前类型,避免传统union的类型混淆问题。通过std::get、std::holds_alternative和std::visit等机制可安全访问值,推荐使用std::visit结合lambda实现类型分发。常用于配置解析、表达式求值、错误处理等场景,如定义Result = std::variant统一处理成功结果与错误信息,提升代码安全性与可维护性。

在C++17中,std::variant 是一种类型安全的联合体(union),用来表示“可以是多种类型之一”的变量。它解决了传统C风格union不安全的问题,比如类型混淆、内存错误等。使用 std::variant 可以在编译期和运行时确保类型正确访问,避免未定义行为。
什么是 std::variant?
std::variant 是一个类模板,定义在 variant 头文件中。它可以持有其模板参数列出的任意一种类型,但每次只能保存其中一种类型的值。与 union 不同的是,std::variant 知道当前存储的是哪种类型,并提供机制来安全地访问它。
例如:
#include #includestd::variant v = 42; // 当前是 intv = 3.14; // 现在是 doublev = "hello"; // 现在是 string
如何访问 variant 中的值?
直接获取值需要小心类型匹配。有几种方式可以安全提取数据:
立即学习“C++免费学习笔记(深入)”;
std::get(v):如果当前类型是 T,返回值;否则抛出 std::bad_variant_access 异常。std::get(v):按类型在模板列表中的位置索引访问。std::holds_alternative(v):检查当前是否是类型 T,返回 bool。std::visit:配合访问者模式,安全调用函数处理不同类型的值。
示例:
if (std::holds_alternative(v)) { std::cout << "Got double: " << std::get(v) << 'n';}
使用 std::visit 进行类型分发
最强大也最推荐的方式是使用 std::visit,它可以对 variant 中的实际类型执行对应的 lambda 或函数对象。
例子:打印 variant 的内容
std::visit([](auto& value) { std::cout << "Value: " << value << 'n';}, v);
也可以使用多个 lambda 区分类型:
std::visit([&](auto& val) { using T = std::decay_t; if constexpr (std::is_same_v) std::cout << "Integer: " << val << 'n'; else if constexpr (std::is_same_v) std::cout << "Double: " << val << 'n'; else std::cout << "String: " << val << 'n';}, v);
常见使用场景
std::variant 特别适合以下情况:
解析配置项,可能是整数、浮点或字符串。表达式求值中节点可能返回不同类型的结果。替代 void* 或 C union,提升类型安全性。实现简单的代数数据类型(ADT),如错误码 + 数据组合。
例如定义一个可能包含结果或错误信息的类型:
using Result = std::variant;Result compute(bool success) {if (success) return 42;else return std::string{"error: failed"};}
// 使用时:Result r = compute(false);if (std::holds_alternative(r)) {std::cout << "Success: " << std::get(r);} else {std::cout << "Error: " << std::get(r);}
基本上就这些。std::variant 让你在保持性能的同时获得类型安全,是现代C++中处理多类型值的首选工具。
以上就是c++++中variant是什么怎么用_C++17 std::variant类型安全联合体使用指南的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1478859.html
微信扫一扫
支付宝扫一扫