新闻中心

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

2025-12-08
浏览次数:
返回列表
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 判断类型。更推荐显式重载:

标贝悦读AI配音 标贝悦读AI配音

在线文字转语音软件-专业的配音网站

标贝悦读AI配音 78 查看详情 标贝悦读AI配音
  • 方法一:用 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的利器【新特性】的详细内容,更多请关注其它相关文章!


# 前向  # 发推广的网站有哪些  # 甘肃抖音seo最专业  # qq群可以推广网站吗  # 淮南家具网站建设地址  # 淘宝店营销推广初期阶段  # seo图片权重  # 赣州网站优化营销  # 移动支付推广营销经理  # 营销推广教程高级版  # 江北seo的优化  # 头文件  # 工具  # 标准版  # 如何实现  # 不同类型  # 如何处理  # 如何使用  # 专为  # 新特性  # 多个  # switch  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  css绝对定位元素脱离父容器怎么办_确保父元素position非static  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  微信语音通话掉线如何解决 微信语音通话稳定优化方法  内存检查:在VS Code中调试C++时的内存视图  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  离线运行Go语言之旅:本地部署与GOPATH配置指南  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  Mac怎么使用表情符号_Mac Emoji快捷键面板  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  如何使用纯J*aScript判断Input元素是否在特定类容器内  163邮箱官方主页登录 直达网易邮箱登录核心页面  J*aScript数据结构转换:将对象数组按类别分组  AngularJS $http POST请求数据传递与Go后端接收实践  J*aScript map 迭代中检测空数组元素的有效方法  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  Angular中单选按钮的正确使用与常见陷阱解析  Composer如何在生产环境安全地执行composer update  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  在Socket.IO连接中实现Access Token自动更新与动态重连  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  如何在 Excel Online 和 Google 表格中更改日期格式  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  outlook中文官网入口地址 outlook官方中文版直达首页链接  提升Kafka消费者健壮性:会话超时处理与消息处理语义  优化大型XML文件解析:基于Python流式处理的内存高效方案  如何将HTML表格多行数据保存到Google Sheet  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  Archive of Our Own官网直达 AO3最新可用地址一览  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  J*a应用集成GitHub CLI与API认证指南  C++ vector二维数组定义_C++ vector of vector用法  文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】  曝R星经典之作开发图 设计简陋但信息密集!  4399体育竞技小游戏_4399小游戏赛事入口  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  jQuery Mask 插件中实现电话号码固定前导零的教程  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  千牛数据看板网页版_千牛数据看板网页版访问方法  淘宝支付提示失败如何解决 淘宝支付流程优化方法 

搜索