0

0

C++中的std::variant怎么用?C++17安全的union类型【现代C++】

冰火之心

冰火之心

发布时间:2026-01-04 11:52:50

|

234人浏览过

|

来源于php中文网

原创

std::variant是C++17引入的类型安全可变容器,编译期确定类型列表,运行时仅持一个活跃值并自动管理生命周期;支持构造、std::get/holds_alternative安全访问及std::visit模式匹配处理。

c++中的std::variant怎么用?c++17安全的union类型【现代c++】

std::variant 是 C++17 引入的类型安全的“可变类型容器”,可以看作是带类型检查、自动管理生命周期的现代 union。它不是运行时动态类型,而是在编译期确定所有可能类型,运行时只持有一个活跃值,并确保析构和访问都安全。

基本用法:定义、构造和访问

声明一个 variant,需明确列出所有允许的类型(最多 16 个,具体取决于实现):

示例:

std::variant v; // 初始状态为 int{0}(第一个类型的默认构造)

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

你可以用初始化列表、赋值或 std::make_variant_alternative(不常用)来构造:

  • v = 42; → 活跃类型变为 int
  • v = std::string{"hello"}; → 自动析构旧值,构造新 string
  • v = 3.14; → 活跃类型变为 double

安全获取值:std::get 和 std::holds_alternative

直接用 std::get(v) 获取指定类型的值,但若当前不持有该类型,会抛出 std::bad_variant_access 异常。

更推荐先判断再取值:

Seko
Seko

商汤科技推出的创编一体的AI短视频创作Agent

下载
  • if (std::holds_alternative<:string>(v)) { ... }
  • auto& s = std::get<:string>(v); // 此时已确保安全

也可用 std::get_if(&v) 返回指针,空指针表示不匹配,避免异常开销。

统一处理多种类型:std::visit

这是 variant 最强大的用法——类似“模式匹配”,对当前活跃值执行对应逻辑,无需手动 if-else 判断类型。

写法一:lambda(推荐)

std::visit([](const auto& x) {
  if constexpr (std::is_same_v<:decay_t>, int>) {
    std::cout   } else if constexpr (std::is_same_v<:decay_t>, std::string>) {
    std::cout   }
}, v);

写法二:自定义 visitor 结构体(适合复用)

struct Printer {
  void operator()(int i) const { std::cout   void operator()(const std::string& s) const { std::cout   void operator()(double d) const { std::cout };

std::visit(Printer{}, v);

注意事项与常见坑

  • variant 不支持 void 或引用类型作为备选项(但可存 std::reference_wrapper
  • 所有备选项必须满足可析构、可移动(多数情况也要求可复制),否则编译失败
  • 默认构造只对第一个类型生效;若首类型不可默认构造,需显式初始化
  • 使用 std::monostate 可表示“空状态”(如 std::variant<:monostate int std::string>

基本上就这些。std::variant 不复杂,但容易忽略类型安全和访问方式的选择。用好它,能显著减少手工管理 union 的错误,让多态数据结构更清晰、更健壮。

相关专题

更多
string转int
string转int

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

314

2023.08.02

if什么意思
if什么意思

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

715

2023.08.22

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

186

2025.07.04

c语言union的用法
c语言union的用法

c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

122

2023.09.27

string转int
string转int

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

314

2023.08.02

从零到实战:Python 编程系统入门专题
从零到实战:Python 编程系统入门专题

本专题面向零编程基础及初学者,系统讲解 Python 编程语言的核心知识与实战技巧。内容涵盖 Python 基础语法、数据结构、函数与模块、常用标准库、简单算法思维,以及真实应用场景下的小项目实战。通过循序渐进的学习路径,帮助读者快速建立编程思维,掌握 Python 在数据处理、自动化脚本及日常开发中的实际应用能力,为后续深入学习 Web 开发、数据分析或人工智能打下坚实基础。

2

2026.01.05

热门下载

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

精品课程

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

共578课时 | 42万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

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

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