Если вы можете использовать C ++ 17, вы можете использовать инструкции по выводу для std::function
следующим образом
template <typename S, typename F,
typename T = typename decltype( std::function{std::declval<F>()} )::result_type>
T applyFun (S const & source, F const & f)
{
return f(source);
}
, но, как указал Олив, для вашей примерной функции нет необходимости в T
, потому что вы можете использовать auto
(из C ++ 14; auto ... -> decltype(f(source))
в C ++ 11).
- EDIT -
Оператор скажет
Хорошая особенность этого решения в том, что я могу использовать T внутри функции (например, если я хочу реализовать vector_map).
Вы можете обнаружить и использоватьT
, также внутри функции, с использованием using
Что-то вроде
template <typename S, typename F>
auto applyFun (S const & source, F const & f)
{
using T = typename decltype( std::function{f} )::result_type;
return f(source);
}
или проще: using T = decltype( f(source) );
.
ОП такжеобратите внимание, что
Недостатком является то, что по какой-то причине теперь я не могу написать [] (const auto& x) { ... }
в вызове функции.
Правильно.Поскольку std::function
типы шаблонов не могут быть выведены из generic-lambda.
Но, учитывая тот факт, что вы знаете тип аргумента, вы можете использовать decltype()
снова
template <typename S, typename F,
typename T = decltype(std::declval<F const>()(std::declval<S const>()))>
T applyFun (S const & source, F const & f)
{ return f(source); }
Это решение должно работать также для C ++ 14 и C ++ 11.