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

news2024/12/23 5:52:45

简介: 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等类型中获取值的函数模板。它接受一个索引作为参数,并返回相应位置的值。

2.应用实例

<1>.v1.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: 0
    std::cout << "isDouble: " << isDouble << std::endl;      // 输出:isDouble: 0
    std::cout << "isString: " << isString << std::endl;      // 输出:isString: 1

    return 0;
}

<2>.v2.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;        // 输出:42
  std::cout << stringValue << std::endl;     // 输出:"Hello"
  std::cout << doubleValue << std::endl;     // 输出:3.14

  return 0;
}

<3>.v3.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;
}

<4>.v4.0

#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;
}

<5>.v5.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(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>>;

    //Prop() = default;
    void setName(const char *name) {
      printf("xxx---------->%s(), line = %d, name = %s\n",__FUNCTION__,__LINE__,name);
      mName = name;
    }

    template <typename T> void set(const T& value) {
      //printf("xxx---------->%s(), line = %d,typeid(value) = %s\n",__FUNCTION__,__LINE__,typeid(value).name());
      printf("xxx---------->%s(), line = %d, value = %d\n",__FUNCTION__,__LINE__,value);
      mElem = value;

      //获取mElem中的int类型的值.
      int32_t val = std::get<int32_t>(mElem);
      printf("xxx---------->%s(), line = %d,val = %d\n",__FUNCTION__,__LINE__,val);
    }

  private:
    std::string mName;
    Elem mElem;
  };

  Prop &findOrAllocateProp(const char *key) {
    auto it = mProps.find(key);
    //printf("xxx---------->%s(), line = %d, key = %s, vlaue = %d\n",__FUNCTION__,__LINE__,key,it->first);
    printf("xxx---------->%s(), line = %d, key = %s\n",__FUNCTION__,__LINE__,key);
    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.coloradmin.cn/o/1015843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Peppertype:AI写作工具

【产品介绍】 名称 Peppertype 具体描述 Peppertype是一款人工智能AI内容生成工具&#xff0c;它通过使用机器学习来理解用户的需求。适合在写作过程中寻求帮助的作家&#xff0c;而无需花时间自己学习如何使用。Peppertypeai支持快速制作电子邮件&#xff0c;30…

nginx 全相联结构的引申

修改 nginx 纯属巧合&#xff0c;任务是将 reuseport 的支持换一种方式。目前 nginx 的方式是 master 创建 worker 数量个 reuseport listening socket&#xff0c;由 worker 继承。在这种实现方式下&#xff0c;效果是 “所有 worker 可以处理所有 listening socket” 这不就是…

安卓内部存储不需要申请权限,外部文件需要申请权限

内部存储和外部存储的访问权限区别&#xff1a; 内部路径&#xff1a;/data/user/0/com.xxx.xxx/ getExternalFilesDir可以获取到属于 App 自身的文件路径&#xff0c;通常是~/Android/data/<package-name>/**/。在该目录中读写文件均不需要申请权限,随着APP卸载就会删…

华为云云耀云服务器L实例评测|Git 私服搭建指南

前言 本文为华为云云耀云服务器L实例测评文章&#xff0c;测评内容是 云耀云服务器L实例 Git 私有服务器搭建指南 系统配置&#xff1a;2核2G 3M Ubuntu 20.04 我们平时在使用代码托管服务的时候&#xff0c;可能某些代码托管平台对成员有限制&#xff0c;或是由于内容原因会对…

自动编码器

Autoencoder is designed in a way to perform task of data encoding plus data decoding to reconstruct input. -- Anushka Jain 前言 两兄弟 N.Coder 和 D.Coder 经营着一家艺术画廊。一周末&#xff0c;他们举办了一场特别奇怪的展览&#xff0c;因为它只有一面墙&#x…

nginx中sent_timeout属性使用注意事项

send_timeout使用注意事项 send_timeout:指客户端向服务器发送请求并且等待服务器返回数据的时间&#xff0c;超过这个时间链接就断开。如果咱们返回的数据复杂&#xff0c;很耗时&#xff0c;就将该值设置大些。注意该时间指准备过程&#xff0c;不是传输过程&#xff08;下载…

在线海报图片设计器、图片编辑器源码/仿照稿定设计源码

在线海报设计系统素材设计源码是一个漂亮且功能强大的在线海报图片设计器&#xff0c;仿照稿定设计而成。该系统适用于多种场景&#xff0c;包括海报图片生成、电商分享图、文章长图、视频/公众号封面等。用户无需下载软件&#xff0c;即可轻松实现创意&#xff0c;迅速完成排版…

7-38 掉入陷阱的数字

输入样例: 5 输出样例: 1:16 2:22 3:13 4:13 ACcode: #include <bits/stdc.h>using namespace std;int main(){int n;cin >> n;vector<int> ans;int limit 1;ans.push_back(n);for(int i0; i<limit; i){//各位数字的和int sum 0;int num ans[i];w…

独立开发了一款Material3风格的RSS阅读器 - Agr Reader

截图 背景&#x1f4d6; 在之前接触到RSS后&#xff0c;发现RSS真是一个十分不错的信息聚合的方式&#xff0c;虽然现在看来RSS的时代已经开始落幕&#xff0c;但是至少目前还是处于能用的阶段。 在我用了Android上好几个RSS阅读App后&#xff0c;发现很多在全文解析方面不是…

栈与队列经典题目——用栈实现队列

上篇文章对栈和队列的一个经典题目——Leetcode.225-用队列实现栈进行讲解。本篇文章将对另一个题目Leetcode.232-用栈实现队列进行讲解 1. Leetcode.232——用栈实现队列&#xff1a; 题目如下&#xff1a; 1.1 大体思路分析&#xff1a; 题目要求需要实现下列函数所表示的…

JAVA注解总结

总结一下java注解。 元注解 元注解也是一种注解。元注解的作用就是来限制和定义一个普通的注解。 注解的语法 public(可选) interface 注解名称{ 具体的参数 } 注解里面的参数 第一个表示参数的类型是什么&#xff0c;类型后面可以跟[],表示数组&#xff0c;在后面就是参数…

详解机器视觉性能指标相关概念——混淆矩阵、IoU、ROC曲线、mAP等

目录 0. 前言 1. 图像分类性能指标 1.1 混淆矩阵(Confusion Matrix) 1.2 准确率(Precision) 1.3 召回率(Recall) 1.4 F1值(F1 score) 1.5 ROC曲线(接收者工作特征曲线&#xff0c;Receiver Operating Characteristic curve) 1.6 mAP(mean Average Precision) 2. 图像分…

Apereo CAS反序列化漏洞中数据加解密研究

Apereo CAS反序列化漏洞中数据加解密研究 0x01、简介0x02、网上获取资料0x03、初步运行失败1、分析&#xff1a;2、Tips&#xff1a; 0x04、分析原因1、自己写解密算法 / 直接使用cas工程的相关jar包、java文件&#xff0c;调用解密函数2、为什么会解密失败&#xff1f; 0x05、…

企业级数据仓库-数仓实战

数仓实战 安装包大小 安装清单 环境搭建 一、环境搭建01&#xff08;机器准备&#xff09; 准备好三台虚拟机&#xff0c;并进行修改hostname、在hosts文件增加ip地址和主机名映射 。 1、设置每个虚拟机的hostname vi /etc/sysconfig/network 修改HOSTNAMEnode02修改hostna…

PY32F003F18之输入捕获

输入捕获是定时器的功能之一&#xff0c;配合外部引脚&#xff0c;捕获脉宽时间或采集周期。 CPU中的定时器最基本的功能就是计数功能&#xff0c;其次是输入捕获(IC)&#xff0c;再次就是比较输出(OC)&#xff0c;还有就是使用引脚对外部时钟进行计数&#xff0c;触发信号捕捉…

6- 华为云查看容器日志

1 查看位置 二 进入容器查看 ls cat main.py # 退出命令是 exit() 或者 quit() cat main.py 在docker使用该命令进入文件后的退出命令

Mapbox gl HTML经纬度点渲染,动态轨迹播放,自定义图形以及轨迹上显示箭头方向

Mapbox gl HTML经纬度点渲染&#xff0c;动态轨迹播放&#xff0c;自定义图形以及轨迹上显示箭头方向 1. 效果图2. 源码2.1 line.html2.2line_arrow.html 参考 今天要排查个问题&#xff0c;需要显示多个经纬度点连接成线段的方向&#xff0c;于是尝试下展示。 1. mapbox渲染经…

element plus封装el-select添加后缀图标并添加远程搜索和对话框功能

当提交的表单Form需要填某个实体的外键ID时&#xff0c;当然不可能使用el-input组件&#xff0c;这个适合提交字符串&#xff0c;然后用户又不可能记住某个引用的外键ID&#xff0c;这时候使用el-select还是必要的。 el-select组件一般都作为下拉选择框使用&#xff0c;但仅在…

Java实现通过文字生成图片

一、前言 在实际应用中&#xff0c;我们可能需要将用户姓名作为头像显示&#xff0c;那么我们可以通过Java来实现。 二、如何实现 1.定义一个工具类&#xff0c;代码如下&#xff1a; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import javax.imageio.ImageIO…

三分钟使用ngrok实现内网穿透

1.官网注册 官网地址&#xff1a;https://ngrok.com/ tips:若使用邮箱注册自行认证 2.下载对应部署电脑 压缩包&#xff08;此处笔者使用自己电脑因此以Windows11作为案例&#xff09; 解压下载的ngrok压缩包&#xff0c;在对应目录进入命令提示符装口&#xff08;也可直接…