0

0

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

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-08 19:02:02

|

950人浏览过

|

来源于php中文网

原创

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 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 中所有可能的类型(否则编译失败)。

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

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

Civitai
Civitai

AI艺术分享平台!海量SD资源和开源模型。

下载

立即学习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 v = 42;
std::visit(MyVisitor{}, v); // 输出:int: 42

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

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

std::variant v1 = 100;
std::variant v2 = true;
std::visit([](const auto& a, const auto& 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 变得非常顺手。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

769

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

535

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

418

2024.03.13

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

200

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

50

2026.01.05

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.1万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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