如何在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
相关产品推荐
相关产品推荐

