Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
C++17的std::variant怎么用_C++类型安全的联合体std::variant访问方法_创想鸟

C++17的std::variant怎么用_C++类型安全的联合体std::variant访问方法

std::variant是C++17引入的类型安全联合体,可持有多种类型之一,支持赋值、emplace初始化,通过std::get、std::get_if、std::holds_alternative安全访问,推荐使用std::visit进行类型分发,适用于JSON解析等多类型场景。

c++17的std::variant怎么用_c++类型安全的联合体std::variant访问方法

在 C++17 中,std::variant 是一个类型安全的联合体(type-safe union),用来表示可以持有多种类型之一的对象。与传统的 union 不同,std::variant 能知道当前存储的是哪种类型,避免了类型错误访问的问题,大大提升了类型安全性。

基本用法:定义和赋值

你可以将 std::variant 看作一个能“装”多个类型的容器,但每次只能保存其中一个类型的一个值。

示例:

#include #include 

int main() {std::variant v;

v = 42;           // 持有 intv = 3.14;         // 持有 doublev = "hello";      // 持有 std::stringreturn 0;

}

立即学习“C++免费学习笔记(深入)”;

初始化方式支持直接赋值、构造函数、emplace 等:

std::variant v = "hello";v.emplace("world"); // 按索引构造v.emplace("hi"); // 按类型构造

如何安全地访问 variant 中的值

由于 variant 可能包含不同类型,直接访问容易出错。C++17 提供了多种安全访问方法:

1. std::get(v) 或 std::get(v)

通过类型或索引获取值,但如果类型不匹配会抛出 std::bad_variant_access 异常。

try {    std::cout << std::get(v) << 'n';} catch (const std::bad_variant_access&) {    std::cout << "当前不是 double 类型!n";}

2. std::get_if(&v)

返回指向当前值的指针,如果类型不匹配则返回 nullptr。适合判断和访问同时进行。

if (auto* p = std::get_if(&v)) {    std::cout << "int 值为: " << *p << 'n';} else if (auto* p = std::get_if(&v)) {    std::cout << "字符串: " << *p << 'n';}

3. std::holds_alternative(v)

判断当前 variant 是否持有指定类型。

if (std::holds_alternative(v)) {    std::cout << "当前是 double: " << std::get(v) << 'n';}

使用 std::visit 进行类型分发(推荐)

最强大且通用的方式是 std::visit,它能对 variant 当前持有的值应用一个可调用对象(如 lambda),自动匹配类型。

std::visit([](const auto& value) {    std::cout << "值是: " << value << ",类型为: "               << typeid(value).name() << 'n';}, v);

也可以使用多个 lambda 处理不同逻辑:

std::visit([(const auto& x) {    using T = std::decay_t;    if constexpr (std::is_same_v)        std::cout << "整数: " << x << 'n';    else if constexpr (std::is_same_v)        std::cout << "浮点: " << x << 'n';    else if constexpr (std::is_same_v)        std::cout << "字符串: " << x << 'n';}, v);

这种方式在编译期生成对应代码,效率高且类型安全。

注意事项和常见技巧

默认构造:variant 默认构造时会构造其第一个类型(前提是该类型可默认构造)。空状态:如果第一个类型不可默认构造,variant 会处于“未初始化”状态,需手动赋值。异常安全:赋值或 emplace 失败时,variant 可能进入“无价值”状态,可通过 v.valueless_by_exception() 判断。性能:variant 的大小等于最大类型的大小加上少量用于类型标识的空间,通常比继承结构更轻量。

基本上就这些。std::variant 非常适合处理“一个变量可能是几种类型之一”的场景,比如解析 JSON、实现表达式求值、状态机等。配合 std::visit 和 std::get_if,既能保证类型安全,又能写出清晰高效的代码。

以上就是C++17的std::variant怎么用_C++类型安全的联合体std::variant访问方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487368.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++ default与delete关键字_C++控制默认函数生成的方法
上一篇 2025年12月19日 10:38:12
C++怎么使用Asio库进行网络编程_C++高性能异步I/O网络库Asio入门
下一篇 2025年12月19日 10:38:30

相关推荐

  • 如何制作一个多合一的Windows安装启动盘

    使用Rufus、Ventoy或GRUB可制作多系统启动盘。首先用Rufus加载多个ISO并创建多启动盘,或通过Ventoy安装后直接复制ISO文件实现即插即用,高级用户还可手动整合ISO并用GRUB定制引导菜单,实现一台电脑安装多版本Windows系统。 如果您希望在一台电脑上安装多个版本的Wind…

    2026年10月2日
    200
  • Claude如何设置工作流程 Claude自动化任务配置指南

    Claude如何设置工作流程 Claude自动化任务配置指南Claude如何设置工作流程 Claude自动化任务配置指南Claude如何设置工作流程 Claude自动化任务配置指南Claude如何设置工作流程 Claude自动化任务配置指南

    本文将详细介绍如何为Claude设置高效的工作流程和自动化任务配置。通过以下内容,可以了解到从基础设置到高级自动化功能的完整操作流程,帮助提升工作效率。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 直接使用“Claude AI网页版在线使…

    2026年10月2日 • 用户投稿
    200
  • 使用 HashMap 实现灵活的 Java 成绩等级划分

    使用 HashMap 实现灵活的 Java 成绩等级划分使用 HashMap 实现灵活的 Java 成绩等级划分使用 HashMap 实现灵活的 Java 成绩等级划分使用 HashMap 实现灵活的 Java 成绩等级划分

    本文介绍如何使用 Java 中的 HashMap 数据结构来实现一个灵活的成绩等级划分系统。通过将成绩等级与分数范围关联,可以方便地根据输入的分数快速确定对应的等级。文章将提供示例代码,并讨论使用 HashMap 实现成绩等级划分的优势和注意事项,帮助读者更好地理解和应用。 HashMap 实现成绩…

    2026年10月2日 • 用户投稿
    200
  • 22.98万元起!新款智界R7/S7上市1小时大定突破5000台

    8月25日,智界汽车官方发布消息,新款智界r7与智界s7在上市仅1小时内,大定订单数突破5000台。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 新款智界R7 在智界与问界联合举办的秋季新品发布会上,新款智界R7和S7正式登场。凭借华为A…

    2026年10月2日
    200
  • js 如何用once创建只执行一次的函数

    js 如何用once创建只执行一次的函数js 如何用once创建只执行一次的函数js 如何用once创建只执行一次的函数js 如何用once创建只执行一次的函数

    once函数通过闭包维护called状态,确保传入函数只执行一次,首次调用时执行并返回结果,后续调用直接返回undefined;2. 除闭包外,也可用对象属性存储状态实现once,原理相同但写法不同;3. 实际应用包括初始化操作、事件监听、防止表单重复提交和数据缓存,均用于需函数仅执行一次的场景,提…

    2026年10月2日 • 用户投稿
    100
  • HashMap迭代实现成绩评级系统

    HashMap迭代实现成绩评级系统HashMap迭代实现成绩评级系统HashMap迭代实现成绩评级系统HashMap迭代实现成绩评级系统

    本文介绍如何使用HashMap在Java中实现一个简单的成绩评级系统。通过将成绩等级作为键,分数阈值作为值存储在HashMap中,可以方便地根据输入的分数查找对应的等级。文章提供详细的代码示例,并解释了如何处理异常输入,帮助读者理解HashMap的迭代以及在实际问题中的应用。 使用HashMap实现…

    2026年10月2日 • 用户投稿
    100
  • AI Overviews支持语音命令吗 AI Overviews语音控制功能

    AI Overviews支持语音命令吗 AI Overviews语音控制功能AI Overviews支持语音命令吗 AI Overviews语音控制功能AI Overviews支持语音命令吗 AI Overviews语音控制功能AI Overviews支持语音命令吗 AI Overviews语音控制功能

    AI Overviews作为人工智能信息整合工具,其交互方式一直是用户关注的焦点。本文将详细解析AI Overviews是否支持语音命令功能,并分步骤说明如何通过语音控制提升操作效率,帮助用户更便捷地获取信息。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek …

    2026年10月2日 • 用户投稿
    100
  • 英伟达发布Rubin CPX重构算力 谷歌/亚马逊/微美全息等AI芯片群雄加速并起!

    英伟达发布Rubin CPX重构算力  谷歌/亚马逊/微美全息等AI芯片群雄加速并起!英伟达发布Rubin CPX重构算力  谷歌/亚马逊/微美全息等AI芯片群雄加速并起!英伟达发布Rubin CPX重构算力  谷歌/亚马逊/微美全息等AI芯片群雄加速并起!英伟达发布Rubin CPX重构算力  谷歌/亚马逊/微美全息等AI芯片群雄加速并起!

    小K播早报《科创板日报》9月17日讯今日科创板早报主要内容有:工信部发布2025版数字化转型指引;Figure完成10亿美元C轮融资;字节游戏辟谣关闭上海工作室。《科创板日报》主播小K为您播报。 市场动态工信部印发《场景化、图谱化推进重点行业数字化转型的参考指引(2025版)》工业和信息化部办公厅近…

    2026年10月2日 • 用户投稿
    100
  • 解决Android PDFView重启后权限问题:一份详细指南

    解决Android PDFView重启后权限问题:一份详细指南解决Android PDFView重启后权限问题:一份详细指南解决Android PDFView重启后权限问题:一份详细指南解决Android PDFView重启后权限问题:一份详细指南

    本文旨在解决Android应用中使用PDFView库(如barteksc/AndroidPdfViewer)在设备重启后出现“Permission Denial”错误的问题。通过分析错误原因,提供代码示例和步骤,帮助开发者正确处理URI权限,确保应用在重启后仍能访问PDF文件。本文重点讲解FLAG_…

    2026年10月2日 • 用户投稿
    200
  • 解决Web部署后媒体文件播放异常:浏览器缓存与调试策略

    解决Web部署后媒体文件播放异常:浏览器缓存与调试策略解决Web部署后媒体文件播放异常:浏览器缓存与调试策略解决Web部署后媒体文件播放异常:浏览器缓存与调试策略解决Web部署后媒体文件播放异常:浏览器缓存与调试策略

    本文旨在探讨Web应用中媒体文件(如MP3、MP4)在本地开发环境正常,但部署到线上后出现播放异常的常见问题。文章将深入分析导致此类问题的原因,特别是聚焦于常被忽视的浏览器缓存机制,并提供一套系统的调试方法,帮助开发者快速定位并解决媒体资源加载失败的困境。 1. 概述:本地正常,线上异常的常见陷阱 …

    2026年10月2日 • 用户投稿
    100
  • win11怎么用U盘重装系统 win11 U盘启动盘制作与重装系统教程

    win11怎么用U盘重装系统 win11 U盘启动盘制作与重装系统教程win11怎么用U盘重装系统 win11 U盘启动盘制作与重装系统教程win11怎么用U盘重装系统 win11 U盘启动盘制作与重装系统教程win11怎么用U盘重装系统 win11 U盘启动盘制作与重装系统教程

    首先准备8GB以上U盘和Windows 11官方镜像,使用Rufus或微PE工具箱制作UEFI兼容的可启动U盘,接着进入BIOS设置U盘为第一启动项,最后通过Windows Setup向导选择自定义安装并完成系统部署。 如果您需要为您的电脑重新安装Windows 11操作系统,使用U盘创建启动盘是一…

    2026年10月2日 • 用户投稿
    100
  • javascript闭包怎么管理浏览器缓存

    javascript闭包怎么管理浏览器缓存javascript闭包怎么管理浏览器缓存javascript闭包怎么管理浏览器缓存javascript闭包怎么管理浏览器缓存

    闭包不能直接操作浏览器缓存,但可通过封装缓存逻辑间接影响缓存行为:1. 利用闭包维持对缓存变量的引用,实现数据的存储与检索;2. 在闭包中实现缓存过期、更新和清理策略;3. 结合http头部信息(如cache-control)决定缓存读取与更新;4. 与service worker协同实现动态缓存管…

    2026年10月2日 • 用户投稿
    100
  • Qualcomm台式机蓝屏芯片组故障怎么解决?完整指南助你恢复稳定。

    Qualcomm台式机蓝屏芯片组故障怎么解决?完整指南助你恢复稳定。Qualcomm台式机蓝屏芯片组故障怎么解决?完整指南助你恢复稳定。Qualcomm台式机蓝屏芯片组故障怎么解决?完整指南助你恢复稳定。Qualcomm台式机蓝屏芯片组故障怎么解决?完整指南助你恢复稳定。

    蓝屏问题多由驱动异常或系统文件损坏引起,首先更新Qualcomm芯片组驱动,依次执行SFC与DISM修复系统文件,重置BIOS至默认设置,并检查硬件连接稳定性,排除内存、硬盘等故障可能。 如果您在使用搭载Qualcomm芯片组的台式机时遇到蓝屏问题,可能是由于硬件兼容性、驱动异常或系统文件损坏导致。…

    2026年10月2日 • 用户投稿
    100
  • Perplexity AI可以过滤内容吗 Perplexity AI内容过滤设置

    Perplexity AI可以过滤内容吗 Perplexity AI内容过滤设置Perplexity AI可以过滤内容吗 Perplexity AI内容过滤设置Perplexity AI可以过滤内容吗 Perplexity AI内容过滤设置Perplexity AI可以过滤内容吗 Perplexity AI内容过滤设置

    Perplexity AI作为一款AI问答工具,其内容过滤功能可以帮助用户管理生成内容的敏感性。本文将详细介绍Perplexity AI的内容过滤机制及设置方法,通过分步骤说明帮助用户理解如何根据需求调整过滤强度。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSee…

    2026年10月2日 • 用户投稿
    000
  • 基于一次性密码(OTP)验证的安全性分析与设计建议

    基于一次性密码(OTP)验证的安全性分析与设计建议基于一次性密码(OTP)验证的安全性分析与设计建议基于一次性密码(OTP)验证的安全性分析与设计建议基于一次性密码(OTP)验证的安全性分析与设计建议

    一次性密码(OTP)作为一种常见的身份验证方式,被广泛应用于邮箱验证、手机号码验证等场景。然而,在OTP系统的设计和实现过程中,如果考虑不周,可能会存在潜在的安全风险。本文将深入探讨这些风险,并提供一些设计建议,以帮助开发者构建更安全的OTP验证系统。 在用户注册但尚未验证邮箱的情况下,存在一种潜在…

    2026年10月2日 • 用户投稿
    100
  • 最高荣誉!TCL科技获第五届中国质量奖

    最高荣誉!TCL科技获第五届中国质量奖最高荣誉!TCL科技获第五届中国质量奖最高荣誉!TCL科技获第五届中国质量奖最高荣誉!TCL科技获第五届中国质量奖

    9月16日,第六届中国质量大会在江苏南京拉开帷幕。tcl科技凭借“极致、领先、协同”的质量管理模式,荣膺第五届中国质量奖,成为广东省及粤港澳大湾区唯一获此殊荣的企业。 尤为引人注目的是,TCL科技首次申报即从全国500余家参评单位中脱颖而出,成功斩获这一国家级奖项,充分彰显了评审专家对其质量管理体系…

    2026年10月2日 • 用户投稿
    100
  • Piti插件怎么集成多个图库_Piti插件集成多个图库操作方法

    Piti插件怎么集成多个图库_Piti插件集成多个图库操作方法Piti插件怎么集成多个图库_Piti插件集成多个图库操作方法Piti插件怎么集成多个图库_Piti插件集成多个图库操作方法Piti插件怎么集成多个图库_Piti插件集成多个图库操作方法

    可通过三种方法实现Piti插件集成多个图库:一、编辑config.json文件,在”image_libraries”数组中添加多个绝对路径;二、使用mklink /J命令创建符号链接,将不同路径合并到统一虚拟目录;三、借助XnView MP等工具整合图库并启用网络服务,供Pi…

    2026年10月2日 • 用户投稿
    100
  • Flink Job Manager 重启导致消息丢失问题排查与解决

    本文针对 Flink 1.16 版本中,在配置了重启策略后,Job Manager 重启导致消息丢失的问题进行分析和解决。文章将探讨可能导致消息丢失的多种原因,包括 Poison Pill 导致的死循环、Source 不支持 Checkpointing 或 Rewind、以及 Checkpoint …

    2026年10月2日
    000
  • JavaScript数据属性值安全转换为数字的专业指南:避免NaN的策略

    本教程详细阐述了在JavaScript中如何安全地将HTML数据属性(data attributes)的值转换为数字,并确保在值无效时返回0,从而有效避免在计算中出现NaN。文章重点介绍了使用parseFloat()而非Number()进行转换,并强调了将|| 0操作符正确放置在转换函数外部的关键性…

    2026年10月2日
    000
  • Gradle项目集成JPA元模型生成器:配置与常见陷阱

    Gradle项目集成JPA元模型生成器:配置与常见陷阱Gradle项目集成JPA元模型生成器:配置与常见陷阱Gradle项目集成JPA元模型生成器:配置与常见陷阱Gradle项目集成JPA元模型生成器:配置与常见陷阱

    本教程旨在指导开发者如何在Gradle项目中正确集成JPA元模型生成器(如Hibernate JPA Modelgen),以实现类型安全的JPA查询。文章将详细介绍必要的Gradle配置,包括依赖管理、源码目录设置以及编译参数。特别地,教程会揭示一个常见的配置陷阱:当使用Spring Boot的依赖…

    2026年10月2日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信