【问题标题】:variant of functions with different return types具有不同返回类型的函数变体
【发布时间】:2023-04-10 15:23:02
【问题描述】:

以下代码无法编译:

#include <functional>
#include <variant>

int main() {
  using ret_void = std::function<void()>;
  using ret_int  = std::function<int()>;

  std::variant<ret_void, ret_int> var;
  var.emplace([](){ return 1; } );
}

编译显示template argument deduction/substitution failed。 谁能解释为什么编译失败?

【问题讨论】:

  • 我认为 lambda 不是 std::fction 类型,而是具有独特类型的函子
  • 我的经验是类型擦除(std::function 用来存储不同的可调用事物)和模板类型推导不能优雅地混合。您可能能够摆脱显式构造 std::function 并使用 CTAD 仍然允许类型推导。像var.emplace(std::function{[](){ return 1; }}); 这样的东西对我有用,也可能对你有用。

标签: c++ variant std-function


【解决方案1】:

这无法编译,因为需要为 std::variant::emplace 提供替代 emplace 的变体的类型或索引:

#include <functional>
#include <variant>

int main() {
  using ret_void = std::function<void()>;
  using ret_int  = std::function<int()>;

  std::variant<ret_void, ret_int> var;
  var.emplace<ret_int>([](){ return 1; });
}

std::variant::emplace[variant.mod] 的所有重载的第一个模板参数是 emplace 替代变量的索引或类型。这些重载都没有以可推导出的方式使用此参数……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2015-04-18
    相关资源
    最近更新 更多