我正在尝试std::visit
种std::variant
类型的std::function
。
为什么以下代码无法编译:
#include <functional>
#include <variant>
int main()
{
std::variant<
std::function< int () >,
std::function< float () >
> func_variant {std::in_place_index<0>, [] () { return 42; }};
auto object = std::visit( [] (auto& func) { return func(); }, func_variant);
return 0;
}
该错误发生在std::visit
的调用中,它说:
error: invalid conversion from ‘std::__success_type<float>::type (*)(main()::<lambda(auto:1&)>&&, std::variant<std::function<int()>, std::function<float()> >&)’ {aka ‘float (*)(main()::<lambda(auto:1&)>&&, std::variant<std::function<int()>, std::function<float()> >&)’} to ‘int (*)(main()::<lambda(auto:1&)>&&, std::variant<std::function<int()>, std::function<float()> >&)’ [-fpermissive]
{ return _Array_type{&__visit_invoke}; }
^
答案 0 :(得分:3)
您的每种std::function
类型都返回不同的类型,因此您要传递给std::visit
的lambda的返回类型取决于lambda的选定元素的类型。这意味着auto-type-deduction无法使用,因为对std::visit
的调用必须具有单个返回类型,该返回类型与变量的哪个元素处于活动状态无关。
您可以创建一个返回类型变量:using returns=std::variant<int,float>
,然后将lambda中的返回值强制转换为该类型:
using returns=std::variant<int,float>;
auto object = std::visit( [] (auto& func) { return returns(func()); }, func_variant);
这样,您的lambda的返回类型在所有情况下都是相同的,但是您将需要查询结果以查看得到的结果。