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

在C++17中,std::variant 是一种类型安全的联合体(union),它能够持有多种类型中的某一种,并且在运行时知道当前存储的是哪种类型。相比传统的C风格union,std::variant避免了未定义行为,提供了类型检查和异常安全性。
1. 包含头文件并定义variant
使用 std::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::get 或 std::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
一键极速绘图,赋能行业工作流
88
查看详情
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++标准库时间与日期操作


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