我正在尝试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
types 返回不同的类型,因此您传递给 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 的返回类型在所有情况下都是相同的,但是您随后需要查询结果以查看您得到了什么。
关于c++ - 访问函数变体时出现 "Invalid conversion"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59102201/