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

夜丽大大_2116

夜丽大大_2116

2026-01-04

274人浏览

原创

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}(第一个类型的默认构造)

你可以用初始化列表、赋值或 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 异常。

更推荐先判断再取值:

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

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

Web Accessibility (WCAG 2 AA))
Web Accessibility (WCAG 2 AA))

将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。

下载

统一处理多种类型: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 的错误,让多态数据结构更清晰、更健壮。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

access c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

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

2023.08.02

7019

3

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

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

2025.11.27

375

14

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

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

2023.09.20

2358

7

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

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

2025.06.09

5134

18

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

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

2025.07.04

5291

25

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

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

2023.09.27

789

5

string转int
string转int

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

2023.08.02

7019

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3365

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4388

10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习