std::visit 是 C++17 引入的专为 std::variant 设计的安全访问工具,通过传入可调用对象(如 lambda)自动匹配当前存储类型,避免手动判断 type index 或冗长 switch-case。

std::visit 是 C++17 引入的、专为 std::variant 设计的访问工具,它让你能安全、清晰地对 variant 中当前持有的类型执行操作,避免手动判断 type index 或写冗长的 switch-case。
最常见写法是用 lambda 表达式作为访问器,编译器会自动匹配当前存储的类型:
std::variant<int, std::string, double> v = "hello";
std::visit([](const auto& x) {
std::cout << "value: " << x << " (type: " << typeid(x).name() << ")\n";
}, v);
// 输出:value: hello (type: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE)
注意:auto& 参数依赖模板推导,lambda 必须能接受 variant 中所有可能的类型(否则编译失败)。
如果不同类型的处理逻辑差异大,直接用 auto 会写一堆 if-else 判断类型。更推荐显式重载:
立即学习“C++免费学习笔记(深入)”;
std::overload(需自己定义或 C++20 起有标准版)组合多个 lambdaoperator() 多次struct MyVisitor {
void operator()(int i) const { std::cout << "int: " << i << '\n'; }
void operator()(const std::string& s) const { std::cout << "string: " << s << '\n'; }
void operator()(double d) const { std::cout << "double: " << d << '\n'; }
};
std::variant<int, std::string, double> v = 42;
std::visit(MyVisitor{}, v); // 输出:int: 42
std::visit 不仅限于单个 variant,还能同时访问多个同构或异构 variant(它们的类型列表可以不同),只要你的 visitor 能接受对应参数个数和类型:
std::variant<int, std::string> v1 = 100;
std::variant<double, bool> v2 = true;
std::visit([](const auto& a, const auto& b) {
std::cout << "v1=" << a << ", v2=" << b << '\n';
}, v1, v2);
// 编译时自动选择匹配的 operator() 组合(这里调用 int + bool 版本)
std::monostate)时,visitor 必须能处理它,否则抛 std::bad_variant_access
auto 时,务必确保所有分支都有定义行为,哪怕只是 static_assert(false)
基本上就这些。std::visit 不复杂但容易忽略细节,用熟了会让 variant 变得非常顺手。
以上就是c++++中的std::visit怎么用_c++ C++17访问variant的利器【新特性】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号