c++ - 访问函数变体时出现 "Invalid conversion"错误

标签 c++ c++17 variant

我正在尝试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/

相关文章:

c++ - 将 std::vector<uint8_t> 转换为 std::string_view

c++ - 模板实例化解析错误

c++ - 是否可以使用 std::variant 的 std::variants

c++ - 如何在 C++ 中正确使用 std::mutex 而不会出现死锁和/或竞争?

c++ - C++动态哈希表

c++ - C++中的智能指针删除

c++ - 工厂方法模式使用继承,而抽象工厂模式使用组合如何?

c++ - 类模板参数推导 - clang 和 gcc 不同

c++ - 如何将变体参数传递给 C++ 中的 DBUS 方法调用?

c++ - 散列 OLE 变体的推荐实现是什么?