在模板中推断lambda返回类型

时间:2013-11-21 12:41:14

标签: 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;
  }

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

2 个答案:

答案 0 :(得分:2)

最简单的方法是接受任何仿函数,而不仅仅是std::function

template <typename F,typename... T>
auto func(F f, T... values) -> decltype(f(values...)) {
    return f(values...);
}

答案 1 :(得分:1)

丢掉另一种选择(因为以上内容有时难以消化)。

使用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