当前位置: 首页 > news >正文

std visit

std::visit

std::visit 使得variant可以使用类似函数重载的条用模式:
std::visit 是 C++17 引入的一个非常强大的工具,用于处理 std::variant(变体类型)中的数据。它允许你对 std::variant 中存储的不同类型的数据执行不同的操作,而无需手动检查类型。以下是 std::visit 的几种常见用法:

1. 使用对象函数方式访问

你可以定义一个访问者类,为每种可能的类型提供一个 operator() 函数。然后,使用 std::visit 调用相应的函数。

示例代码:
#include <iostream>
#include <variant>
#include <string>struct MyVisitor {void operator()(double d) const {std::cout << d << '\n';}void operator()(int i) const {std::cout << i << '\n';}void operator()(const std::string& s) const {std::cout << s << '\n';}
};int main() {std::variant<int, double, std::string> var1(42), var2(3.14), var3("visit");std::visit(MyVisitor(), var1);std::visit(MyVisitor(), var2);std::visit(MyVisitor(), var3);return 0;
}

2. 使用泛型 Lambda 表达式访问

std::visit 也可以与泛型 Lambda 表达式一起使用,这使得代码更加简洁。

示例代码:
#include <iostream>
#include <variant>
#include <string>auto printvariant = [](const auto& val) {std::cout << val << std::endl;
};int main() {std::variant<int, double, std::string> var1(42), var2(3.14), var3("visit");std::visit(printvariant, var1);std::visit(printvariant, var2);std::visit(printvariant, var3);return 0;
}

3. 使用重载的 Lambda 表达式访问

你可以定义一组 Lambda 表达式,并使用 std::visit 来选择最适合当前类型的 Lambda。

示例代码:
#include <iostream>
#include <variant>
#include <string>template<typename... Ts>
struct overload : Ts... {using Ts::operator()...;
};template<typename... Ts>
overload(Ts...) -> overload<Ts...>;int main() {std::variant<int, std::string> var(42);std::visit(overload{[](int i) { std::cout << "int: " << i << '\n'; },[](const std::string& s) { std::cout << "string: " << s << '\n'; },}, var);return 0;
}

4. 多个 std::variant 的访问

std::visit 还可以同时处理多个 std::variant,这在处理多个可能的类型组合时非常有用。

示例代码:
#include <iostream>
#include <variant>
#include <string>struct LightItem {};
struct HeavyItem {};int main() {std::variant<LightItem, HeavyItem> basicPackA;std::variant<LightItem, HeavyItem> basicPackB;std::visit(overload{[](LightItem&, LightItem&) { std::cout << "2 light items\n"; },[](LightItem&, HeavyItem&) { std::cout << "light & heavy items\n"; },[](HeavyItem&, LightItem&) { std::cout << "heavy & light items\n"; },[](HeavyItem&, HeavyItem&) { std::cout << "2 heavy items\n"; },}, basicPackA, basicPackB);return 0;
}
http://www.dtcms.com/a/137459.html

相关文章:

  • centos部署的openstack发布windows虚拟机
  • 卷积神经网络 CNN 模型介绍
  • 使用DeepSeek如何提升课题申报书中研究内容的专业性?25个进阶DeepSeek指令
  • QT —— 信号和槽(自定义信号和槽函数)
  • 《Timer: Generative Pre-trained Transformers Are Large Time Series Models》
  • C++Cherno 学习笔记day20 [81]-[85] 可视化基准测试、单例模式、小字符串优化sso、跟踪内存分配、左值与右值
  • 蓝桥杯B组Java省赛强化
  • Cribl (实验) vpc-flow 数据抽样
  • 中科院1区顶刊Expert Systems with Applications ESO:增强型蛇形算法,性能不错
  • LeetCode -- Flora -- edit 2025-04-16
  • Numpy常用库方法总结
  • Langchain + Gemini API调用基本操作
  • MGR实现mysql高可用性
  • JVM:垃圾回收
  • JVM:运行时数据区和线程
  • 【计算机方向】中科院双一区TOP顶刊,IF=14.7,Nature招牌1区Top,中一篇直接就稳了!
  • map用法介绍
  • 前沿计组知识入门(六)
  • Arkts应用全局UI状态存储和持久化V2(AppStorageV2、PersistenceV2和@Type)
  • Idea集成AI:CodeGeeX开发
  • 【Leetcode-Hot100】缺失的第一个正数
  • 【LangChain核心组件】Memory:让大语言模型拥有持续对话记忆的工程实践
  • 杭电oj(2013-2028)题解
  • 100个GEO基因表达芯片或转录组数据处理023.GSE24807
  • 分布式锁框架Lock4j
  • 毛笔书体检测-hog+svm python opencv源码
  • 开启 Python 编程之旅:基础入门实战班全解析
  • antv/g6 图谱实现,自定义节点,自定义边,边动画
  • 内网穿透原理解析、使用网络场景、及如何实现公网访问步骤教程
  • Android ViewPager使用预加载机制导致出现页面穿透问题