You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在std::visit的overload重载中传入第二个额外参数

问题原因

你定义的重载lambda每个都接收2个入参,但调用std::visit时仅传入了1个variant变量v,参数数量不匹配触发编译报错。
std::visit的传参逻辑为:第一个参数是访问器,后续传入的N个参数会被依次拆解值后,按顺序传递给访问器的operator(),因此访问器重载的参数数量必须和后续传入的参数数量完全一致。你需要把想要传递的std::shared_ptr<std::jthread>实例sp也作为std::visit的入参传入,才能被lambda接收。

修正后的代码

#include <iostream>
#include <memory>
#include <string>
#include <thread>
#include <variant>

template<class... Ts>
struct overload : Ts... {
    using Ts::operator()...;
};

template<class... Ts>
overload(Ts...) -> overload<Ts...>;

class ObjA {
    int a;
};

class ObjB {
    int b;
};

int main()
{
    ObjA a;

    std::variant<ObjA, ObjB> v;

    v = a;

    int rc { 0 };// unused here

    std::shared_ptr<std::jthread> sp = nullptr;

    std::visit(overload {
        [&rc](ObjA& objA, std::shared_ptr<std::jthread> thr) {
            std::cout << "ObjA!\n";        
        },
        [&rc](ObjB& objB, std::shared_ptr<std::jthread> thr) {
            std::cout << "ObjB!\n";
        }
    }, v, sp); // 此处新增传入sp作为第二个参数

    return 0;
}

补充说明

如果不需要对第二个参数做类型适配,也可以直接把sp捕获到lambda里,不需要作为参数传递,也能解决编译问题。

内容的提问来源于stack exchange,提问作者Ender

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:06:04