вывести тип возврата лямбда в шаблоне

Здравствуйте, я пытаюсь создать функцию, которая будет вызывать функцию, предоставленную в качестве параметра с некоторыми предоставленными аргументами, и возвращать ее значение, мой текущий подход выглядит следующим образом.

  #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 на void и удалю auto&&decltype, это сработает, но почему-то я не могу получить правильный тип возврата.


person javascrub    schedule 21.11.2013    source источник


Ответы (2)


Лучший и самый простой способ — принять любой функтор, а не только std::function:

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

Добавление одной дополнительной альтернативы (поскольку вышеизложенное иногда было бы слишком сложно переварить).

С С++ 17 вы можете сделать:

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

а еще есть std::result_of до C++17.

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

person Tomasz W    schedule 02.07.2018