我正在尝试std::visit
std::function
类型的std::variant
。
为什么下面的代码不编译:
#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}; }
^
每个std::function
类型都返回不同的类型,因此要传递给std::visit
的 lambda 的返回类型取决于所选 lambda 元素的类型。这意味着自动类型推断不起作用,因为对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 的返回类型在所有情况下都是相同的,但您需要查询结果以查看您得到的内容。