0

0

c++中的std::variant是什么_c++多类型变量variant用法讲解

尼克

尼克

发布时间:2025-10-23 12:09:02

|

296人浏览过

|

来源于php中文网

原创

std::variant 是 C++17 引入的类型安全联合体,可存储多种类型之一,需通过 std::get、std::holds_alternative 或 std::visit 安全访问,常用于替代传统 union 和处理多类型数据。

c++中的std::variant是什么_c++多类型变量variant用法讲解

在C++17中引入的 std::variant 是一种类型安全的“联合体”(union),可以保存多种不同类型中的某一种值,但同一时间只能存储其中一种类型。它解决了传统 union 的类型不安全问题,是处理多类型变量的一种现代、安全且高效的方式。

什么是 std::variant?

std::variant 属于 std 命名空间,定义在 头文件中。它可以看作是一个“可变类型的容器”,比如你可以定义一个 variant,让它既可以存 int,也可以存 std::string,或者 double:

#include
#include
#include iostream>

例如:

std::variant v;
v = 42; // 存 int
v = "hello"; // 存 string
v = 3.14; // 存 double

每次赋值都会替换当前存储的值和类型。

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

如何访问 variant 中的值?

由于 variant 可能包含多种类型,直接获取值是不安全的。C++ 提供了几种方式来安全地提取内容:

  • std::get(v):通过类型获取值,如果当前不是该类型会抛出 std::bad_variant_access 异常。
  • std::get(v):通过类型在 variant 列表中的索引获取(从0开始)。
  • std::holds_alternative(v):检查当前是否存储的是指定类型,返回 bool。

示例:

std::variant v = "Hello";

if (std::holds_alternative<:string>(v)) {
  std::cout (v) } else {
  std::cout (v) }

使用 visit 访问 variant(推荐方式)

更强大和类型安全的方式是使用 std::visit,它可以对 variant 中的实际值应用一个可调用对象(如 lambda),自动匹配类型。

Tago AI
Tago AI

AI生成带货视频,专为电商卖货而生

下载

例如,定义一个打印 variant 内容的 visitor:

std::visit([](const auto& value) {
  std::cout }, v);

如果你有多个 variant,std::visit 还支持同时访问多个 variant 的当前值。

复杂一点的例子:

std::variant v = 3.14;

std::visit([](const auto& val) {
  if constexpr (std::is_same_v) {
    std::cout   } else if constexpr (std::is_same_v) {
    std::cout   } else {
    std::cout   }
}, v);

常见用途与注意事项

适用场景:

  • 替代不安全的 union
  • 解析可能包含不同类型的数据(如 JSON 值)
  • 函数返回多种类型之一(配合 std::monostate 实现可选状态)
  • 事件处理系统中传递不同类型的事件数据

注意点:

  • variant 默认构造时会用第一个可默认构造的类型进行初始化。如果第一个类型不能默认构造,需要显式初始化。
  • 访问错误类型会抛异常(除非用 visit 或先判断)。
  • 性能上略高于指针或继承方案,无堆分配开销。
  • 不能存引用、数组或 void 类型。

基本上就这些。std::variant 让你在保持类型安全的同时灵活处理多种数据类型,是现代 C++ 中处理“可能是这个,也可能是那个”的理想工具。不复杂但容易忽略细节,建议结合 std::visit 和 std::holds_alternative 使用更安全。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

419

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

309

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

778

2023.08.22

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

2

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.9万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号