Я хотел бы написать функцию шаблона, которая принимает 2 значения и функтор или лямбда. Функция вызывает функтор с этими значениями и возвращает результат.
template <typename T, typename Fn>
_ReturnTypeOfPred_ Apply(T x, T y, Fn fn)
{
return fn(x, y);
}
Вопрос. Как определить возвращаемый тип Apply
, чтобы он стал равным типу возврата Fn
? Это не обязательно равно T
, как в этом примере функтора
template <typename T>
auto Sum(T x, T y) -> decltype(x+y)
{
return x+y;
}
Обновление
Первый пример был упрощен. Должен ли он работать?
template <typename TContainer, typename Fn>
auto Apply(const TContainer& x, const TContainer& y, Fn fn) -> decltype(fn(x.front(), y.front()))
{
return fn(x.front(), y.front());
}
Будет ли он работать, если я повторяю выражение return
в decltype
возвращаемого типа? Есть ли более элегантный способ?