当前位置: 首页 > 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;
}

相关文章:

  • 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开发
  • 天柱建设局网站/济南特大最新消息
  • 品牌建设网站公司/网络运营培训班多少钱
  • 东昌网站建设/seo优化培训公司
  • 本地做的网站怎么放到网上去/aso推广
  • 建设网站的技术风险/网页模板
  • 东莞信科网站建设/百度一下 你就知道官方