新闻中心

C++怎么使用C++17的std::variant_C++类型安全的联合体(union)

2025-12-07
浏览次数:
返回列表
std::variant是C++17引入的类型安全联合体,需包含头文件,可存储多种类型之一并记录当前类型;通过std::get或std::get_if安全访问,避免未定义行为;v.index()返回当前类型的索引;结合std::visit与lambda实现类型安全的多态操作,适用于解析、状态机等场景。

c++怎么使用c++17的std::variant_c++类型安全的联合体(union)

在C++17中,std::variant 是一种类型安全的联合体(union),它能够持有多种类型中的某一种,并且在运行时知道当前存储的是哪种类型。相比传统的C风格union,std::variant避免了未定义行为,提供了类型检查和异常安全性。

1. 包含头文件并定义variant

使用 std::variant 需要包含头文件 ,然后可以声明一个能容纳若干类型的 variant:

#include <variant>
#include <iostream>
#include <string>
<p>int main() {
std::variant<int, double, std::string> v;
v = 42;                    // 存入 int
v = 3.14;                  // 存入 double
v = "hello";               // 存入 string
}</p>

2. 访问variant中的值

不能直接解引用variant,需要通过 std::getstd::get_if 安全访问内容:

  • 使用 std::get(v) 获取指定类型的值(如果类型不匹配会抛出 std::bad_variant_access)
  • 使用 std::get_if(&v) 返回指针,可用于判断是否为某类型

try {
    std::cout << std::get<double>(v) << '\n';  // 输出 3.14
} catch (const std::bad_variant_access&) {
    std::cout << "当前不是double类型\n";
}
<p>if (auto p = std::get_if<int>(&v)) {
std::cout << "当前是int:" << *p << '\n';
} else {
std::cout << "当前不是int\n";
}</p>

3. 检查当前持有的类型

可以通过 v.index() 获取当前类型在模板参数列表中的索引:

Openflow Openflow

一键极速绘图,赋能行业工作流

Openflow 88 查看详情 Openflow
switch (v.index()) {
    case 0: std::cout << "当前是int\n"; break;
    case 1: std::cout << "当前是double\n"; break;
    case 2: std::cout << "当前是string\n"; break;
}

4. 使用std::visit处理多种类型

最强大的功能是结合 lambda 和 std::visit,实现类型安全的多态操作:

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

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

std::visit([&](auto& arg) {
    using T = std::decay_t<decltype(arg)>;
    if constexpr (std::is_same_v<T, int>) {
        std::cout << "整数:" << arg * 2 << '\n';
    } else if constexpr (std::is_same_v<T, double>) {
        std::cout << "浮点数:" << arg * 1.5 << '\n';
    } else if constexpr (std::is_same_v<T, std::string>) {
        std::cout << "字符串:" << arg + "!" << '\n';
    }
}, v);

基本上就这些。std::variant让C++具备了类似其他语言的“代数数据类型”能力,适合用于解析、状态机、表达式求值等场景,比裸union更安全易用。

以上就是C++怎么使用C++17的std::variant_C++类型安全的联合体(union)的详细内容,更多请关注其它相关文章!


# 的是  # SEO栏目页是什么  # 交通运输seo优化费用  # 网站建设设计找哪家  # 营销推广四种形势  # 优酷帮忙网站建设  # 鹰潭seo公司 排名  # seo搜索排名优化方案  # seo每日一题贴  # 坂田推广网站设计  # seo12345678  # 是一种  # 几种方法  # access  # 文件系统  # 几种  # 头文件  # 多态  # 检测方法  # 如何判断  # 是否存在  # stream  # switch  # ios  # c++  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: html5 app怎么运行环境_配html5 app运行环境【教程】  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  excel如何生成目录 excel一键生成工作表目录超链接  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  Python getattr() 异常处理深度解析:避免程序意外退出  解决Flask中Quill编辑器内容提交失败及TypeError的指南  yy漫画网页版官方入口_yy漫画官网登录页面链接  使用Pandas转换并合并DataFrame:多列映射至统一结构  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  网易大神账号申诉需要多久_网易大神账号申诉流程说明  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  单射、满射与双射的关系 一文理清所有逻辑  Lar*el 8 多关键词数据库搜索优化实践  如何使用Node.js csv 包按条件移除含空字段的CSV记录  AO3最新入口2025公告_AO3中文官网合集  Composer如何在生产环境安全地执行composer update  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  红果短剧网页版官网入口 官方最新网址发布  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  VS Code远程开发时如何处理文件权限问题  poki网页游戏推荐_poki免费游戏平台入口  AngularJS $http POST请求数据传递与Go后端接收实践  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  如何在 Windows 11 中启动游戏手柄设置  漫蛙官网正版漫画入口 漫蛙2官方网页登录地址  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  台积电1.4nm工艺A14瞄准2028:10年来性能提升80%  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  mysql如何设置表访问权限_mysql表访问权限配置  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  优化Log4j2控制台输出性能:解决异步日志瓶颈  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  千牛数据看板网页版_千牛数据看板网页版访问方法  J*a 递归快速排序中静态变量的状态管理与陷阱  c++ 命名空间怎么用 c++ namespace使用指南  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  星露谷物语官网入口 星露谷物语游戏官网入口  知音漫客正版漫画平台_知音漫客官网账号登录  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  必由学官网首页入口 必由学教师网页版登录指南  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】 

搜索