新闻中心
C++怎么使用C++17的std::variant_C++类型安全的联合体(union)
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
相关栏目:
【
科技资讯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文件技巧【技巧】


2025-12-07
浏览次数:次
返回列表
) {
std::variant<int, double, std::string> v;
v = 42; // 存入 int
v = 3.14; // 存入 double
v = "hello"; // 存入 string
}</p>