std::variant支持std::get和std::visit两种访问方式:std::get适用于已知类型时直接提取值,需配合std::holds_alternative避免异常;std::visit通过函数对象或lambda实现类型安全的多态访问,适合处理多种类型的分支逻辑,支持单个或多个variant的联合操作,更安全且易于扩展。

在C++17中,std::variant 是一个类型安全的联合体(union),可以保存多种类型中的某一种值。要访问其中的内容,主要使用 std::get 和 std::visit 两种方式。它们各有适用场景,下面分别说明用法。
std::get 用于直接获取 variant 中存储的某种类型的值,前提是你知道当前存储的是哪种类型,否则会抛出 std::bad_variant_access 异常。
支持通过类型或索引访问:
示例:
立即学习“C++免费学习笔记(深入)”;
#include <variant>
#include <iostream>
int main() {
std::variant<int, double, std::string> v = 3.14;
// 按类型获取
if (v.index() == 1) {
double val = std::get<double>(v);
std::cout << "Value: " << val << "\n";
}
// 按索引获取(double 是第1个索引)
double val2 = std::get<1>(v);
std::cout << "By index: " << val2 << "\n";
// 错误访问会抛异常
try {
std::string s = std::get<std::string>(v); // 当前不是 string
} catch (const std::bad_variant_access&) {
std::cout << "Not a string!\n";
}
}
建议先用 v.index() 或 std::holds_alternative 判断类型:
if (std::holds_alternative<double>(v)) {
std::cout << std::get<double>(v);
}
当 variant 可能包含多种类型,且需要根据不同类型执行不同逻辑时,std::visit 是更安全、更灵活的选择。它会自动调用对应类型的处理函数,无需手动判断。
基本语法:
std::visit(可调用对象, variant...);
可调用对象可以是 lambda、函数对象或普通函数。常用写法是使用泛型 lambda 或结构体重载 operator()。
示例:使用泛型 lambda 处理不同类型
#include <variant>
#include <vector>
#include <iostream>
int main() {
std::vector<std::variant<int, double, std::string>> vec = {10, 3.14, "hello"};
for (auto& v : vec) {
std::visit([](auto& arg) {
std::cout << arg << " (" << typeid(arg).name() << ")\n";
}, v);
}
}
如果你需要为每种类型写不同的逻辑,可以定义专门的 visitor 结构体:
struct MyVisitor {
void operator()(int i) const {
std::cout << "Integer: " << i << "\n";
}
void operator()(double d) const {
std::cout << "Double: " << d << "\n";
}
void operator()(const std::string& s) const {
std::cout << "String: " << s << "\n";
}
};
// 使用
std::variant<int, double, std::string> v = "world";
std::visit(MyVisitor{}, v);
std::visit 还支持多个 variant 同时访问(适用于函数参数数量相同的场景):
std::variant<int, double> v1 = 5;
std::variant<int, double> v2 = 3.14;
std::visit([](auto& a, auto& b) {
std::cout << a + b << "\n";
}, v1, v2);
基本上就这些。合理使用 std::get 和 std::visit,可以让 variant 的使用既安全又高效。
以上就是C++的std::variant如何访问_C++17中std::visit与std::get的使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号