首页 > 后端开发 > C++ > 正文

c++中的std::visit怎么用_c++ C++17访问variant的利器【新特性】

裘德小鎮的故事
发布: 2025-12-08 19:02:02
原创
938人浏览过
std::visit 是 C++17 引入的专为 std::variant 设计的安全访问工具,通过传入可调用对象(如 lambda)自动匹配当前存储类型,避免手动判断 type index 或冗长 switch-case。

c++中的std::visit怎么用_c++ c++17访问variant的利器【新特性】

std::visit 是 C++17 引入的、专为 std::variant 设计的访问工具,它让你能安全、清晰地对 variant 中当前持有的类型执行操作,避免手动判断 type index 或写冗长的 switch-case。

基本用法:传入一个可调用对象 + variant 对象

最常见写法是用 lambda 表达式作为访问器,编译器会自动匹配当前存储的类型:

std::variant<int, std::string, double> v = "hello";
std::visit([](const auto&amp; x) {
    std::cout << "value: " << x << " (type: " << typeid(x).name() << ")\n";
}, v);
// 输出:value: hello (type: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE)
登录后复制

注意:auto& 参数依赖模板推导,lambda 必须能接受 variant 中所有可能的类型(否则编译失败)。

处理不同类型:用重载 lambda 或 visitor 类

如果不同类型的处理逻辑差异大,直接用 auto 会写一堆 if-else 判断类型。更推荐显式重载:

Seede AI
Seede AI

AI 驱动的设计工具

Seede AI 713
查看详情 Seede AI

立即学习C++免费学习笔记(深入)”;

  • 方法一:用 std::overload(需自己定义或 C++20 起有标准版)组合多个 lambda
  • 方法二:写一个结构体 visitor,重载 operator() 多次
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
登录后复制

访问多个 variant:支持同时 visit 多个(C++17 起)

std::visit 不仅限于单个 variant,还能同时访问多个同构或异构 variant(它们的类型列表可以不同),只要你的 visitor 能接受对应参数个数和类型:

std::variant<int, std::string> v1 = 100;
std::variant<double, bool> v2 = true;
std::visit([](const auto&amp; a, const auto&amp; b) {
    std::cout << "v1=" << a << ", v2=" << b << '\n';
}, v1, v2);
// 编译时自动选择匹配的 operator() 组合(这里调用 int + bool 版本)
登录后复制

注意事项:别踩这些坑

  • variant 为空(std::monostate)时,visitor 必须能处理它,否则抛 std::bad_variant_access
  • lambda 用 auto 时,务必确保所有分支都有定义行为,哪怕只是 static_assert(false)
  • 捕获外部变量的 lambda 要小心生命周期 —— visit 是立即调用,没问题;但若保存 visitor 对象再 later 调用,就得自己管理引用安全

基本上就这些。std::visit 不复杂但容易忽略细节,用熟了会让 variant 变得非常顺手。

以上就是c++++中的std::visit怎么用_c++ C++17访问variant的利器【新特性】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号