C++的std::variant如何访问_C++17中std::visit与std::get的使用方法

std::variant支持std::get和std::visit两种访问方式:std::get适用于已知类型时直接提取值,需配合std::holds_alternative避免异常;std::visit通过函数对象或lambda实现类型安全的多态访问,适合处理多种类型的分支逻辑,支持单个或多个variant的联合操作,更安全且易于扩展。

c++的std::variant如何访问_c++17中std::visit与std::get的使用方法

在C++17中,std::variant 是一个类型安全的联合体(union),可以保存多种类型中的某一种值。要访问其中的内容,主要使用 std::getstd::visit 两种方式。它们各有适用场景,下面分别说明用法。

使用 std::get 访问特定类型的值

std::get 用于直接获取 variant 中存储的某种类型的值,前提是你知道当前存储的是哪种类型,否则会抛出 std::bad_variant_access 异常。

支持通过类型或索引访问:

std::get(variant) —— 按类型获取 std::get(variant) —— 按类型在模板参数列表中的位置获取

示例:

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

#include #include int main() {    std::variant v = 3.14;    // 按类型获取    if (v.index() == 1) {        double val = std::get(v);        std::cout << "Value: " << val << "n";    }    // 按索引获取(double 是第1个索引)    double val2 = std::get(v);    std::cout << "By index: " << val2 << "n";    // 错误访问会抛异常    try {        std::string s = std::get(v); // 当前不是 string    } catch (const std::bad_variant_access&) {        std::cout << "Not a string!n";    }}

建议先用 v.index() 或 std::holds_alternative 判断类型:

if (std::holds_alternative(v)) {    std::cout << std::get(v);}

使用 std::visit 实现类型安全的多态访问

当 variant 可能包含多种类型,且需要根据不同类型执行不同逻辑时,std::visit 是更安全、更灵活的选择。它会自动调用对应类型的处理函数,无需手动判断。

基本语法:

std::visit(可调用对象, variant...);

可调用对象可以是 lambda、函数对象或普通函数。常用写法是使用泛型 lambda 或结构体重载 operator()

示例:使用泛型 lambda 处理不同类型

#include #include #include int main() {    std::vector<std::variant> vec = {10, 3.14, "hello"};    for (auto& v : vec) {        std::visit([](auto& arg) {            std::cout << arg << " (" << typeid(arg).name() << ")n";        }, v);    }}

如果你需要为每种类型写不同的逻辑,可以定义专门的 visitor 结构体:

struct MyVisitor {    void operator()(int i) const {        std::cout << "Integer: " << i << "n";    }    void operator()(double d) const {        std::cout << "Double: " << d << "n";    }    void operator()(const std::string& s) const {        std::cout << "String: " << s << "n";    }};// 使用std::variant v = "world";std::visit(MyVisitor{}, v);

std::visit 还支持多个 variant 同时访问(适用于函数参数数量相同的场景):

std::variant v1 = 5;std::variant v2 = 3.14;std::visit([](auto& a, auto& b) {    std::cout << a + b << "n";}, v1, v2);

std::get 与 std::visit 的选择建议

当你确定类型,或者已通过 std::holds_alternative 检查后,使用 std::get 直接提取值,适合简单场景。 当你需要对 variant 的所有可能类型进行分支处理,尤其是逻辑较复杂时,优先使用 std::visit,代码更安全、清晰,避免异常风险。 std::visit 更符合函数式风格,也更容易扩展新类型。

基本上就这些。合理使用 std::get 和 std::visit,可以让 variant 的使用既安全又高效。

以上就是C++的std::variant如何访问_C++17中std::visit与std::get的使用方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 10:52:10
下一篇 2025年12月19日 10:52:22

相关推荐

发表回复

登录后才能评论
关注微信