如何将重载中的第二个参数传递给 std::visit?

How to pass a second parameter in overload to std::visit?

我正在尝试将 std::shared_ptr 作为此 lambda 中的参数传递,但此 std::visit 出现错误。如果我在重载中省略第二个参数,它工作正常。

错误可以在这里看到。 https://coliru.stacked-crooked.com/a/95b62272fa49335d

#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);

    return 0;
}

您已将一个可调用对象传递给 std::visit,它接受两个参数。但是,可调用参数的数量必须与提供给 std::visit 的变体数量相匹配。也就是说,std::visit(c, v) 仅在 c 接受一个参数时才编译,而 std::visit(c, v1, v2) 仅在 c 接受两个参数时编译,依此类推。这是因为 std::visit 通过调用 c 来工作,每个变体都有一个参数,其类型是当前包含在相应变体中的类型。

我不确定您要在代码中做什么,因为在您的示例中,大多数变量都未使用。也许您的问题可以通过在 lambda 表达式中捕获一个 std::shared_ptr<std::jthread> 对象来解决,因此只需要将一个参数(ObjA&/ObjB&)传递给调用运算符。