快速导航×

C++怎么使用C++17的std::variant_C++类型安全的联合体(union)2025-12-07 21:51:02
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 


相关栏目: 【 企业资讯168 】 【 行业动态20933 】 【 网络营销52431 】 【 网络学院91036 】 【 运营推广7012 】 【 科技资讯60970


相关推荐: 葱吃多了会怎样 葱吃多了会伤胃吗  zookeeper 都有哪些功能?  GELab-Zero— 阶跃星辰开源的 GUI Agent 模型  高德地图公交到站提醒失败如何解决 高德提醒权限设置  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  如何在Promise链中有效终止错误处理后的执行  德邦快递查询平台 德邦快递物流信息查询入口  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  如何将HTML表格多行数据保存到Google Sheet  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  《如龙》开发商做格斗!放出豪言目标年度最佳!  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  将JSON对象数组转置为键值对列表的实用指南  不同用户不同价格! 索尼开启账户个性化定价测试  魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】  利用Bokeh CustomJS动态控制DataTable列可见性  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  Django模型中自动计算可用余额的实现方法  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  J*aScript异步迭代器_j*ascript异步遍历  服务端验证_j*ascript输入检查  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  《刺客信条:影》PS5 Pro和Switch 2画面对比  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  京东单号查询入口_京东快递订单追踪入口  CSS Box Model与弹性按钮:维持布局稳定的动画实践  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  html5 app怎么运行环境_配html5 app运行环境【教程】  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  age动漫网站入口 age动漫官网直接访问入口  Promise错误处理:在catch后终止链式then执行的策略  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  微博网页版主页入口 微博官方网站免登录访问  深入理解J*aScript Promise异步执行顺序与微任务队列  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  qq游戏网页版直接玩_qq游戏免下载快速入口  响应式图片在网页设计中的正确实现方法  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  c++如何使用chrono库处理时间_c++标准库时间与日期操作