如何将重载中的第二个参数传递给 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&
)传递给调用运算符。
我正在尝试将 std::shared_ptr
错误可以在这里看到。 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&
)传递给调用运算符。