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

福建省建设执业资格管理注册中心网站百度快速排名软件

福建省建设执业资格管理注册中心网站,百度快速排名软件,余姚外贸网站建设,asp.net 当前网站文章目录 简介基本概念定义和使用std::variant与传统联合体union的区别 多类型值存储示例初始化修改判断variant中对应类型是否有值获取std::variant中的值获取当前使用的type在variant声明中的索引 访问std::variant中的值使用std::get使用std::get_if 错误处理和访问未初始化…

image.png

文章目录

    • 简介
    • 基本概念
      • 定义和使用std::variant
      • 与传统联合体union的区别
    • 多类型值存储示例
      • 初始化
      • 修改
      • 判断variant中对应类型是否有值
      • 获取std::variant中的值
      • 获取当前使用的type在variant声明中的索引
    • 访问std::variant中的值
      • 使用std::get
      • 使用std::get_if
    • 错误处理和访问未初始化的std::variant
    • 应用场景
      • 解析命令行
      • 解析ini文件
      • 语言解析器
      • 求解方程的根
      • 错误处理
      • 状态机
      • 不使用虚表和继承实现的多态
    • 总结

简介

在C++的发展历程中,C++17带来了许多实用的新特性,其中std::variant尤为引人注目。它本质上是一种类型安全的联合体,能够在同一时刻持有多种可能类型中的某一个值。这种特性为开发者提供了极大的便利,在面对需要处理多种不同类型数据的场景时,std::variant提供了一种灵活且高效的解决方案,使得代码编写更加简洁、安全。

基本概念

定义和使用std::variant

std::variant是一个模板类,借助模板参数包的特性,它能够存储多种不同类型的值。其声明形式如下:

template<class... Types>
class variant;

这里的Types代表了一系列的类型,意味着我们可以根据实际需求,传入任意数量和种类的类型。例如,若要创建一个std::variant对象,使其能够存储intstd::stringdouble类型的值,可以这样定义:

std::variant<int, std::string, double> myVar;

与传统联合体union的区别

传统的C风格联合体union虽然也能实现存储不同类型的值,但与std::variant相比,存在诸多劣势。首先,std::variant具备类型安全性,而union则需要开发者手动管理数据成员的活跃性。在使用union时,如果错误地访问了当前未存储的类型数据,就会导致未定义行为。而std::variant会自动跟踪当前存储的值的类型,开发者无需手动干预。其次,std::variant提供了更为友好和安全的访问方式,使得代码在处理不同类型数据时更加可靠和易于理解。

多类型值存储示例

初始化

std::variant对象的初始化十分便捷。以下面代码为例,创建一个std::variant对象v,并初始化为int类型的值123:

#include <iostream>
#include <variant>int main() {std::variant<int, std::string, double> v(123);return 0;
}

修改

在程序运行过程中,可以根据实际需求修改std::variant对象所存储的值的类型。例如,将上述v的值修改为std::string类型的"HelloWorld":

#include <iostream>
#include <variant>int main() {std::variant<int, std::string, double> v(123);v = "HelloWorld";return 0;
}

判断variant中对应类型是否有值

为了确保类型安全,经常需要判断std::variant中是否存储了特定类型的值。这时,可以使用std::holds_alternative函数来实现:

#include <iostream>
#include <variant>int main() {std::variant<int, std::string, double> v(123);v = "HelloWorld";if (std::holds_alternative<std::string>(v)) {std::cout << "has std::string" << std::endl;}return 0;
}

获取std::variant中的值

获取std::variant中的值主要有两种方式。一种是通过指定类型来获取:

#include <iostream>
#include <variant>int main() {std::variant<int, std::string, double> v("HelloWorld");std::cout << std::get<std::string>(v) << std::endl;return 0;
}

另一种是通过索引来获取,索引从0开始计数:

#include <iostream>
#include <variant>int main() {std::variant<int, std::string, double> v("HelloWorld");std::cout << std::get<1>(v) << std::endl;return 0;
}

获取当前使用的type在variant声明中的索引

通过调用index成员函数,可以获取当前std::variant中存储的值的类型在声明时的索引位置:

#include <iostream>
#include <variant>int main() {std::variant<int, std::string, double> v("HelloWorld");std::cout << v.index() << std::endl;return 0;
}

访问std::variant中的值

使用std::get

std::get是访问std::variant中值的常用方法,如前文示例,它既可以通过指定类型,也能通过索引来获取值。不过,使用时需注意,如果std::variant中当前存储的值并非所指定的类型,会抛出std::bad_variant_access异常。

使用std::get_if

std::get_if是另一种访问std::variant值的方式,它能避免抛出异常。当std::variant中存储的是指定类型的值时,std::get_if会返回一个指向该值的指针;否则,返回nullptr。示例如下:

#include <iostream>
#include <variant>int main() {std::variant<int, std::string, double> v("HelloWorld");if (auto str = std::get_if<std::string>(&v)) {std::cout << *str << std::endl;}return 0;
}

错误处理和访问未初始化的std::variant

std::variant未进行初始化,或者当前存储的值并非期望获取的类型时,调用std::get会抛出std::bad_variant_access异常。例如:

#include <iostream>
#include <variant>int main() {std::variant<int, std::string, double> v(123);try {std::cout << std::get<std::string>(v) << std::endl;} catch (const std::bad_variant_access& e) {std::cerr << "Caught exception: " << e.what() << std::endl;}return 0;
}

而使用std::get_if可以避免这种异常情况的发生,通过检查返回的指针是否为nullptr,来决定是否进行后续操作。

应用场景

解析命令行

在解析命令行参数时,参数可能有多种类型,如整数、字符串等。std::variant可以方便地存储和处理这些不同类型的参数。

解析ini文件

ini文件中的配置项可能有不同的数据类型,std::variant能有效地处理这种多类型数据的解析。

语言解析器

语言解析过程中,词法单元可能有多种类型,如标识符、关键字、常量等。std::variant可以用来存储和管理这些不同类型的词法单元。

求解方程的根

在数值计算中,方程的根可能是实数、复数等不同类型,std::variant可以灵活地存储这些结果。

错误处理

在函数返回值中,可以使用std::variant来同时表示成功结果和错误信息,通过不同的类型来区分。

状态机

状态机的状态可能有多种类型,std::variant可以用于存储和管理这些状态。

不使用虚表和继承实现的多态

通过std::variant结合std::visit(本文未详细介绍),可以实现一种不依赖虚表和继承的多态机制。

总结

std::variant作为C++17的重要特性之一,为开发者提供了强大的功能。它以类型安全和便捷的接口,使得处理多种可能类型的数据变得轻松且安全。在实际编程中,合理运用std::variant,能够显著增强代码的灵活性和可维护性,让代码更加简洁高效。

http://www.hkea.cn/news/487604/

相关文章:

  • 做网站需要多少兆空间wix网站制作
  • 哪些网站教做生物实验今日新闻联播
  • 铜川市住房和城乡建设局网站信息流广告哪个平台好
  • 太原市建设交易中心网站首页百度手机助手app安卓版官方下载
  • 昆山网站建设网站建设郑州网络推广哪个好
  • 瑜伽网站设计国外推广网站
  • 什么网站做国外批发百度推广自己怎么做
  • 网站管理工具百度推广可以自己开户吗
  • 三水网站制作中山做网站推广公司
  • ysl网站设计论文郑州seo地址
  • 做食品的网站设计要注意片多多可以免费看电视剧吗
  • 网站排名推广自己怎么做长沙seo代理商
  • 手机网站改版公司加盟关键词优化排名查询
  • html5 图片网站建设企业网站多少钱
  • 企业网站定制开发流程网络营销的概念及特点
  • 做火影网站背景图农村电商平台有哪些
  • 国内html5网站建设seo兼职工资一般多少
  • 青海西宁网站建设公司百度网络推广
  • 服装公司网站设计百度站长收录入口
  • 做搜索关键词任务网站网站维护是什么意思
  • 2018什么做网站百度网盘网页版入口
  • 深圳福田大型商城网站建设石家庄最新疫情最新消息
  • 网站版面结构chatgpt 网站
  • 网站后期推广是谁来做广州百度推广开户
  • 不上此网站枉做男人免费制作网站平台
  • 防红短链接生成佛山抖音seo
  • 网站建设php带数据库模板站长工具四叶草
  • 做网站客户拖着不验收店铺推广渠道有哪些方式
  • 站群系统哪个好用怎样进行seo推广
  • 淄博网站建设方案网络推广是做什么的