templates - 推断模板中的 lambda 返回类型

标签 templates c++11 lambda type-inference variadic-templates

您好,我正在尝试创建一个函数,它将调用作为参数提供的函数以及一些提供的参数并返回其值,我当前的方法如下

  #include <functional>
  #include <iostream>
  #include <type_traits>


  template <typename Res,typename... T>
  auto func(typename std::common_type<std::function<Res(T...)>>::type f, T... values) -> decltype(f(values...)) {
    f(values...);
  }

  int fx(int x,int y){return x+y; }
  int main() {
>>  func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8);
    return 0;
  }

如果我用 void 替换 Res 并删除 auto&&decltype 它可以工作,但不知何故我无法获得正确的返回类型。

最佳答案

加入一种额外的替代方案(因为上面的内容有时会难以消化)。

使用 c++17 你可以这样做:

template <typename F, typename... T, typename RES = std::invoke_result<F, T...>>
RES func(F f, T... values) {
    return f(values...);
}

还有 C++17 之前的 std::result_of

https://en.cppreference.com/w/cpp/types/result_of

关于templates - 推断模板中的 lambda 返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20121262/

相关文章:

python - 如何使用 boost::python 将模板化类作为一个类公开给 python

c++ - 使用 std::move 和 std::shared_ptr 有什么好处和风险(如果有的话)

c++ - 自执行 C++11 lambda 的成本

c++ - 容器如何处理 lambda 表达式的参数

c++ - 循环类型定义

java - 如何在 Play Framework 中预先选择单选按钮/复选框组?

C++11模板函数接受多个模板别名

c++ - 复制复制者和复制分配的删除 - 公共(public)、私有(private)或 protected ?

c++ - 具有特定元素类型的通用可迭代类型

c++ - 参数列表中没有 "const"无法编译 lambda