C++之std::holds_alternative、std::get、std::variant应用实例(二百一十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之std::get用法。

1.在C++中,std::holds_alternative是一个模板函数,用于检查给定的std::variant对象是否包含指定类型的值。它返回一个bool值,指示给定类型是否存在于std::variant中。
2.在C++中,std::get是用于从std::tuplestd::variant等类型中获取值的函数模板。它接受一个索引作为参数,并返回相应位置的值。
3.在C++中,std::variant是C++17标准引入的一种通用多态类型。它能够在一个单一的变量中存储不同的类型。std::variant的作用是提供了一种类型安全的方式来处理多个可能的类型。

std::variant可以存储一组预定义的类型之一,这些预定义类型称为“可选类型列表”。当创建一个std::variant对象时,你需要指定可选类型列表。这样,你就可以在这个std::variant对象中存储这些类型中的任意一个。

使用std::variant时,你可以使用std::get来获取存储在std::variant中的值,或者使用std::visit来对std::variant中的值进行多态处理。此外,还可以使用std::holds_alternative来检查std::variant中是否存储了特定的类型。

2.应用实例

<1>.v1.0: std::variant应用实例

#include <variant>
#include <iostream>
#include <string>int main() {std::variant<int, std::string> var;var = 42; // 存储一个int类型的值std::cout << std::get<int>(var) << std::endl; // 输出: 42var = "Hello"; // 存储一个std::string类型的值std::cout << std::get<std::string>(var) << std::endl; // 输出: Helloreturn 0;
}

<2>.v2.0:std::holds_alternative用法

#include <iostream>
#include <variant>
#include <string>int main() {std::variant<int, double, std::string> myVariant = "Hello";// 使用std::holds_alternative检查指定类型是否存在于variant中bool isInt = std::holds_alternative<int>(myVariant);bool isDouble = std::holds_alternative<double>(myVariant);bool isString = std::holds_alternative<std::string>(myVariant);std::cout << "isInt: " << isInt << std::endl;            // 输出:isInt: 0std::cout << "isDouble: " << isDouble << std::endl;      // 输出:isDouble: 0std::cout << "isString: " << isString << std::endl;      // 输出:isString: 1return 0;
}

<3>.v3.0: 对于std::tuplestd::get的用法。

#include <iostream>
#include <tuple>int main() {std::tuple<int, std::string, double> myTuple(42, "Hello", 3.14);// 使用std::get获取tuple中的值int intValue = std::get<0>(myTuple);std::string stringValue = std::get<1>(myTuple);double doubleValue = std::get<2>(myTuple);std::cout << intValue << std::endl;        // 输出:42std::cout << stringValue << std::endl;     // 输出:"Hello"std::cout << doubleValue << std::endl;     // 输出:3.14return 0;
}

<4>.v4.0: 对于std::variantstd::get的用法。

#include <iostream>
#include <variant>
#include <string>int main() {std::variant<int, std::string, double> myVariant = 42;// 使用std::get获取variant中存储的值int intValue = std::get<int>(myVariant);std::cout << intValue << std::endl;        // 输出:42// 尝试使用std::get获取不匹配的类型,会抛出std::bad_variant_access异常try {std::string stringValue = std::get<std::string>(myVariant);} catch(const std::bad_variant_access& e) {std::cout << "Error: " << e.what() << std::endl;  // 输出:Error: std::bad_variant_access}return 0;
}

<5>.v5.0: std::holds_alternative、 std::variant实例

#include <iostream>
#include <variant>
#include <string>
#include <utility>using namespace std;using Elem = std::variant<std::monostate, int32_t, int64_t, double, std::string, std::pair<int64_t, int64_t>>;int main() {Elem e1 = 42;Elem e2 = "Hello, world!";Elem e3 = 3.14;Elem e4 = std::make_pair(10, 20);if (std::holds_alternative<int32_t>(e1)) {int32_t value = std::get<int32_t>(e1);cout << "e1 is an int32_t: " << value << endl;}if (std::holds_alternative<std::string>(e2)) {std::string value = std::get<std::string>(e2);cout << "e2 is a string: " << value << endl;}if (std::holds_alternative<double>(e3)) {double value = std::get<double>(e3);cout << "e3 is a double: " << value << endl;}if (std::holds_alternative<std::pair<int64_t, int64_t>>(e4)) {std::pair<int64_t, int64_t> value = std::get<std::pair<int64_t, int64_t>>(e4);cout << "e4 is a pair: (" << value.first << ", " << value.second << ")" << endl;}return 0;
}

<6>.v6.0 综合应用实例

#include <iostream>
#include <string>
#include<typeinfo>
#include <variant>
#include <map>using namespace std;class Item {
public:template<typename S, typename T>Item &set(S key, T value) {printf("xxx---------->%s(), line = %d, key = %s, vlaue = %d\n",__FUNCTION__,__LINE__,key,value);//findOrAllocateProp函数返回Prop对象然后,然后调用员函数set(),最终key值设置到mName, value设置到mElem中.findOrAllocateProp(key).set(value);return *this;}Item &setInt32(const char *key, int32_t value) {printf("xxx---------->%s(), line = %d, key = %s, vlaue = %d\n",__FUNCTION__,__LINE__,key,value);return set(key, value);}class Prop {public:using Elem = std::variant<std::monostate, int32_t, int64_t, double, std::string, std::pair<int64_t, int64_t>>;//1.设置key值给mNamevoid setName(const char *name) {printf("xxx---------->%s(), line = %d, name = %s\n",__FUNCTION__,__LINE__,name);mName = name;}//2.将valuec传给mElem.template <typename T> void set(const T& value) {printf("xxx---------->%s(), line = %d, value = %d\n",__FUNCTION__,__LINE__,value);mElem = value;//获取mElem中的value值.int32_t val = std::get<int32_t>(mElem);printf("xxx---------->%s(), line = %d,val = %d\n",__FUNCTION__,__LINE__,val);}public:std::string mName;Elem mElem;};//findOrAllocateProp函数返回Prop对象然后,然后调用员函数set()Prop &findOrAllocateProp(const char *key) {auto it = mProps.find(key);//开始key对应的value为空.if (it != mProps.end()){//不走此分支.return it->second;}Prop &prop = mProps[key];prop.setName(key);printf("xxx---------->%s(), line = %d, key = %s, nName = %s\n",__FUNCTION__,__LINE__,key,prop.mName.c_str());return prop;}std::map<std::string, Prop> mProps;
};int main(){Item it;it.setInt32("Tom", 18);}

<7>.v7.0

#include <iostream>
#include <string>
#include<typeinfo>
#include <variant>
#include <map>using namespace std;class Item {
public:template<typename S, typename T>Item &set(S key, T value) {printf("xxx---------->%s(), line = %d, key = %s, vlaue = %d\n",__FUNCTION__,__LINE__,key,value);//findOrAllocateProp函数返回Prop对象然后,然后调用员函数set(),最终key值设置到mName, value设置到mElem中.findOrAllocateProp(key).set(value);//Or// Prop m_prop = findOrAllocateProp(key);// printf("xxx---------->%s(), line = %d, key = %s, value = %d\n",__FUNCTION__,__LINE__,m_prop.mName.c_str(),std::get<int32_t>(m_prop.mElem));return *this;}Item &setInt32(const char *key, int32_t value) {printf("xxx---------->%s(), line = %d, key = %s, vlaue = %d\n",__FUNCTION__,__LINE__,key,value);return set(key, value);}//key: mName; value:mElem.class Prop {public:using Elem = std::variant<std::monostate, int32_t, int64_t, double, std::string, std::pair<int64_t, int64_t>>;//1.设置key值给mNamevoid setName(const char *name) {printf("xxx---------->%s(), line = %d, name = %s\n",__FUNCTION__,__LINE__,name);mName = name;}//2.将valuec传给mElem.template <typename T> void set(const T& value) {mElem = value;//获取mElem中的value值.int32_t val = std::get<int32_t>(mElem);printf("xxx---------->%s(), line = %d,val = %d\n",__FUNCTION__,__LINE__,val);}public:std::string mName;//keyElem mElem;//value};//findOrAllocateProp函数返回Prop对象然后,然后调用员函数set()Prop &findOrAllocateProp(const char *key) {auto it = mProps.find(key);//开始key对应的value为空.if (it != mProps.end()){//不走此分支.return it->second;}Prop &prop = mProps[key];prop.setName(key);    return prop;}std::map<std::string, Prop> mProps;
};int main(){Item it;it.setInt32("Tom", 18);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/136718.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云产品试用系列-Serverless 应用引擎 SAE

Serverless 应用引擎 SAE&#xff08;Serverless App Engine&#xff09;是一个全托管、免运维、高弹性的通用 PaaS平台。SAE 支持 Spring Boot、Spring Cloud、Dubbo、HSF、Web 应用和 XXL-JOB、ElasticJob任务的全托管&#xff0c;零改造迁移、无门槛容器化、并提供了开源侧诸…

VUE3写后台管理(3)

VUE3写后台管理&#xff08;3&#xff09; 1.环境1.node2.vite3.Element-plus4.vue-router5.element icon6.less7.vuex8.vue-demi9.mockjs10.axios11.echarts 2.首页1.布局Main2.头部导航栏CommonHeader3.左侧菜单栏CommonLeft4.首页Home1.从后端获取数据显示到前端table的三种…

vue动态修改浏览器title和icon图标

vue动态修改浏览器title和icon图标 实例代码 setTitleIcon(){var link document.querySelector("link[rel*icon]") || document.createElement(link);link.type image/x-icon;link.rel shortcut icon;link.href /002.png; // 图片放public目录document.getElem…

SSM - Springboot - MyBatis-Plus 全栈体系(十)

第二章 SpringFramework 五、Spring AOP 面向切面编程 4. Spring AOP 框架介绍和关系梳理 AOP是一种区别于OOP的编程思维&#xff0c;用来完善和解决OOP的非核心代码冗余和不方便统一维护问题&#xff01;代理技术&#xff08;动态代理|静态代理&#xff09;是实现AOP思维编…

红黑树的定义和性质以及插入、删除操作

1.红黑树发明的原因 分析二叉排序树&#xff0c;平衡二叉树&#xff0c;红黑树的算法效率&#xff1a; BSTAVL TreeRed-Black Tree时间196019621972时间复杂度&#xff08;增删查&#xff09; O ( n ) O(n) O(n) O ( l o g 2 n ) O(log_2n) O(log2​n) O ( l o g 2 n ) O(log…

激光雷达录制pcap类型的包

查看IP 上图中的eno1就是网卡名&#xff0c;就可以使用如下命令录制 sudo tcpdump -i eno1 host 192.168.1.200 -w lidar.pcap-i 后面是网卡名&#xff0c;host 后面是ip&#xff0c;-w后是pcap包名称。

Ubuntu 22.04安装过程

iso下载地址 Ubuntu Releases 1.进入引导菜单 选择Try or Install Ubuntu Server安装 2.选择安装语言 默认选择English 3.选择键盘布局 默认即可 4.选择安装服务器版本 最小化安装 5.配置网络 选择ipv4 选择自定义 DHCP也可 6.配置代理 有需要可以配置 这里跳过 7.软件源 …

群晖 Docker版qbittorrent 下载显示错误 解决方法

这些天在折腾AIO玩&#xff0c;PVE虚拟机底层&#xff0c;核显直通&#xff0c;群晖安装&#xff0c;免不了踩些坑。 今天写篇博客&#xff0c;讲述一下群晖 Docker版qbittorrent 下载显示错误的解决方法&#xff0c;顺便记录一下配置&#xff0c;以便日后折腾可以参考。 直接…

几个国内可用的强大的GPT工具

前言&#xff1a; 人工智能发布至今&#xff0c;过去了九个多月&#xff0c;已经成为了我们不管是工作还是生活中一个重要的辅助工具&#xff0c;大大提升了效率&#xff0c;作为一个人工智能的自然语言处理工具&#xff0c;它给各大行业的提供了一个巨大的生产工具&#xff0c…

机器学习算法基础--逻辑回归

目录 1.数据收集及处理 2.数据提取及可视化 3.逻辑回归训练样本并且测试 4.绘制散点决策边界 逻辑回归的方法已经在数学建模里面讲过了&#xff0c;这里就不多讲了。 本篇我们主要是利用逻辑回归的方法来求解分类问题。 1.数据获取及处理 import pandas as pd from sklearn…

【深度学习框架格式转化】【CPU】Pytorch模型转ONNX模型格式流程详解【入门】

【深度学习框架格式转化】【GPU】Pytorch模型转ONNX模型格式流程详解【入门】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习框架格式转化】【GPU】Pytorch模型转ONNX模型格式流程详解【入门】前言PyTorch模型环境搭建(CPU)安装onn…

中国汽车供应商远赴德国,中国智驾方案能否远渡重洋?

作者|Amy 编辑|德新 今年的上海车展&#xff0c;中国智能汽车的进步有目共睹&#xff0c;吸引了大批外企高管和研发人员的关注&#xff0c;甚至引发了海外车企一系列的动作和调整。 而在刚刚结束的慕尼黑车展&#xff0c;中国车企及汽车供应链把「肌肉」秀到了现代汽车起源地…

大模型如何赋能智能客服

2022年&#xff0c;大模型技术的出色表现让人们瞩目。随着深度学习和大数据技术的发展&#xff0c;大模型在很多领域的应用已经成为可能。许多公司开始探索如何将大模型技术应用于自己的业务中&#xff0c;智能客服也不例外。 智能客服是现代企业中非常重要的一部分&#xff0…

Python 图形化界面基础篇:创建工具栏

Python 图形化界面基础篇&#xff1a;创建工具栏 引言 Tkinter 库简介步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建工具栏步骤4&#xff1a;向工具栏添加工具按钮步骤5&#xff1a;处理工具按钮的点击事件步骤6&#xff1a;启动…

基于matlab实现的卡尔曼滤波匀加速直线运动仿真

完整程序&#xff1a; clear clc %% 初始化参数 delta_t 0.1; %采样时间 T 8; %总运行时长 t 0:delta_t:T; %时间序列 N length(t); %序列的长度 x0 0; %初始位置 u0 0; %初速度 U 10; %控制量、加速度 F [1 delta_t 0 1]; %状态转移矩阵 B …

【c#-Nuget 包“在此源中不可用”】 Nuget package “Not available in this source“

标题c#-Nuget 包“在此源中不可用”…但 VS 仍然知道它吗&#xff1f; (c# - Nuget package “Not available in this source”… but VS still knows about it?) 听起来您的公司有一个发布包的内部 NuGet feed&#xff0c;而不是公共 NuGet.org feed。您应该向您的同事询问…

CentOS 7 安装踩坑

CentOS与Ubuntu并称为Linux最著名的两个发行版&#xff0c;但由于笔者主要从事深度学习图像算法工作&#xff0c;Ubuntu作为谷歌和多数依赖库的亲儿子占据着最高生态位。但最近接手的一个项目里&#xff0c;甲方指定需要在CentOS7上运行项目代码&#xff0c;笔者被迫小小cos了一…

在华为云服务器上CentOS 7安装单机版Redis

https://redis.io/是官网地址。 点击右上角的Download。 可以进入https://redis.io/download/——Redis官网下载最新版的网址。 然后在https://redis.io/download/页面往下拉&#xff0c;点击下图超链接这里。 进入https://download.redis.io/releases/下载自己需要的安装…

【二叉树】的顺序存储(堆的实现)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

64位Ubuntu20.04.5 LTS系统安装32位运行库

背景&#xff1a; 在ubutu&#xff08;版本为20.04.5 LTS&#xff09;中运行./arm-none-linux-gnueabi-gcc -v 后提示“no such device”。 经多方查证&#xff0c;是ubutu的版本是64位的&#xff0c;而需要运行的编译工具链是32位的&#xff0c;因此会不兼容。 解决方法就是在…