• 常用
  • 百度
  • google
  • 站内搜索

数码

C++中std::visit遍历Variant的用法示例

  • 更新日期:2025-11-27
  • 查看次数:3495

std::visit 是C++中安全访问 std::variant 值的推荐方法,通过结合 lambda 表达式统一处理所有可能类型,支持单个或多个 variant 的访问,并要求处理所有类型以确保类型安全。

c++中的std::visit怎么遍历一个variant_c++ visit访问variant的使用示例

在C++中,std::visit 是用来安全访问 std::variant 中所存储值的推荐方式。由于 variant 可能包含多种不同类型的数据,直接获取值容易出错,而 std::visit 结合 lambda 表达式可以统一处理所有可能的类型。

基本用法:使用 std::visit 遍历 variant

std::visit 接受一个可调用对象(如 lambda)和一个或多个 variant,然后根据 variant 当前持有的类型,自动调用对应的处理逻辑。

示例代码:

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

int main() { // 定义一个可以持有 int、double 或 std::string 的 variant std::variant<int, double, std::string> var;

// 设置不同的值并使用 visit 访问
var = 42;
std::visit([](const auto&amp; value) {
    std::cout &lt;&lt; "当前值: " &lt;&lt; value &lt;&lt; ", 类型: " 
              &lt;&lt; typeid(value).name() &lt;&lt; "\n";
}, var);

var = 3.14;
std::visit([](const auto&amp; value) {
    std::cout &lt;&lt; "当前值: " &lt;&lt; value &lt;&lt; ", 类型: " 
              &lt;&lt; typeid(value).name() &lt;&lt; "\n";
}, var);

var = std::string("Hello");
std::visit([](const auto&amp; value) {
    std::cout &lt;&lt; "当前值: " &lt;&lt; value &lt;&lt; ", 类型: " 
              &lt;&lt; typeid(value).name() &lt;&lt; "\n";
}, var);

return 0;

}

使用结构化 lambda 处理不同类型

如果不同类型的处理逻辑差异较大,可以在 lambda 中使用 if-constexpr 来判断类型:

std::visit([](const auto& value) {
    using T = std::decay_t<decltype(value)>;
    if constexpr (std::is_same_v<T, int>) {
        std::cout << "整数: " << value * 2 << "\n";
    } 
    else if constexpr (std::is_same_v<T, double>) {
        std::cout << "浮点数: " << value * 1.5 << "\n";
    } 
    else if constexpr (std::is_same_v<T, std::string>) {
        std::cout << "字符串: " << value + "!" << "\n";
    }
}, var);

同时访问多个 variant

std::visit 还支持同时访问多个 variant,适用于需要组合多个 variant 值的场景:

std::variant<int, double> v1 = 10;
std::variant<int, double> v2 = 20.5;

std::visit([](const auto& a, const auto& b) { std::cout << "相加结果: " << a + b << "\n"; }, v1, v2);

只要两个 variant 的当前类型都支持 + 操作,这段代码就能正常运行。

注意事项

  • 必须确保 variant 不是处于 valueless_by_exception 状态(例如异常导致切换失败)
  • lambda 必须能处理 variant 中所有可能的类型,否则编译会失败
  • 返回类型应一致,或让编译器能推导出公共类型

基本上就这些。std::visit 提供了一种类型安全且简洁的方式来“遍历” variant 的可能取值,配合 lambda 使用非常灵活。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken