值得一看
广告
彩虹云商城
广告

热门广告位

c++怎么使用std::variant_c++ std::variant使用方法

c++kquote>std::variant是C++17引入的类型安全联合体,可存储多种类型之一,需包含<variant>头文件;声明时指定允许的类型列表,如std::variant<int, double, std::string> v;赋值时自动选择对应类型;访问值需使用std::get<T>(v)或std::get_if<T>(&v)确保类型安全,前者类型不匹配会抛出std::bad_variant_access异常,后者返回指针便于安全检查;可用std::holds_alternative<T>(v)判断当前是否为某类型,或用v.index()获取类型索引;结合std::visit可对不同类型的值统一处理,支持泛型lambda或函数对象实现多态调用;适用于配置解析、表达式求值等场景,需编译器支持C++17及以上标准。

c++怎么使用std::variant_c++ std::variant使用方法

在C++17中引入的std::variant是一个类型安全的联合体(union),可以保存多种类型中的某一种值。它解决了传统union类型不安全的问题,使用起来更可靠且易于管理。

基本用法

std::variant定义在<variant>头文件中。声明一个variant时,需要指定它可以容纳的类型列表。


#include <variant>
#include <iostream>

例如,创建一个可以存储int、double或std::string的variant:


std::variant<int, double, std::string> v;
v = 42; // 存int
v = 3.14; // 存double
v = “hello”; // 存string

访问variant中的值

不能直接解引用variant,必须通过正确方式获取其当前持有的值。

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

1. 使用std::get

可以通过类型或索引来获取值,但必须确保类型匹配,否则会抛出std::bad_variant_access异常。


v = 3.14;
if (std::holds_alternative<double>(v)) {
   double val = std::get<double>(v);
   std::cout << val << std::endl;
}

2. 使用std::get_if

AppMall应用商店

AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店56

查看详情
AppMall应用商店

返回指针,适合检查并安全访问值。


if (auto* p = std::get_if<int>(&v)) {
   std::cout << “int: ” << *p << std::endl;
} else if (auto* p = std::get_if<std::string>(&v)) {
   std::cout << “string: ” < *p << std::endl;
}

判断当前类型

使用std::holds_alternative检查当前存储的类型:


if (std::holds_alternative<int>(v)) {
   std::cout << “当前是int类型\n”;
}

也可以用v.index()获取当前类型的索引(从0开始):


switch (v.index()) {
   case 0: /* int */ break;
   case 1: /* double */ break;
   case 2: /* string */ break;
}

结合std::visit进行类型分发

最强大的功能是配合std::visit,实现对不同类型的统一处理。


std::visit([](const auto& value) {
   std::cout << “值是: ” << value << std::endl;
}, v);

也可以写成具名lambda或函数对象:


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

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

基本上就这些。std::variant让多类型值的安全管理变得简单,特别适合解析配置、表达式求值、状态机等场景。注意编译器需支持C++17及以上标准,并开启对应模式(如g++ -std=c++17)。

相关标签:

c++ access ios switch stream String if switch 多态 include const auto break union int double void Lambda 指针 Struct operator 泛型 对象
温馨提示: 本文最后更新于2025-10-02 16:31:19,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞7赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容