C++ 的 visit 函数介绍

        在C++中,visit函数通常与访问者模式(Visitor Pattern)相关联,这是一种行为设计模式,用于将数据操作与数据结构分离。然而,在C++20中,std::visit被引入作为std::variantstd::visit的一部分,用于处理变体类型(std::variant)的访问和操作。

   std::variant是一个类型安全的联合体,可以存储多个类型中的一个,但一次只能存储一个值。std::visit则是一个函数模板,用于对std::variant中当前存储的值应用一个可调用对象(如函数、函数对象、lambda表达式等)。

        下面是一个使用std::variantstd::visit的示例代码:

#include <iostream>
#include <variant>
#include <string>

// 定义一个可调用对象(函数对象)来处理不同的类型
struct Visitor {
    void operator()(int i) const {
        std::cout << "Visiting int: " << i << std::endl;
    }

    void operator()(double d) const {
        std::cout << "Visiting double: " << d << std::endl;
    }

    void operator()(const std::string& s) const {
        std::cout << "Visiting string: " << s << std::endl;
    }
};

int main() {
    // 创建一个std::variant,它可以存储int、double或std::string
    std::variant<int, double, std::string> var;

    // 给variant赋值
    var = 42;
    std::visit(Visitor{}, var); // 输出: Visiting int: 42

    var = 3.14;
    std::visit(Visitor{}, var); // 输出: Visiting double: 3.14

    var = std::string("Hello, World!");
    std::visit(Visitor{}, var); // 输出: Visiting string: Hello, World!

    return 0;
}

        在这个示例中,我们定义了一个Visitor结构体,它重载了operator()以处理不同的类型(intdoublestd::string)。然后,我们创建了一个std::variant<int, double, std::string>类型的变量var,并给它赋了不同的值。每次赋值后,我们都使用std::visit函数模板将Visitor对象应用于var,从而根据var当前存储的类型调用相应的operator()方法。

   std::visit的工作原理是,它根据std::variant中当前存储的类型,选择并调用可调用对象(在本例中是Visitor)中对应的重载函数。这使得我们可以以一种类型安全且易于扩展的方式处理std::variant中存储的不同类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F-Halcon

浏览即鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值