Да, есть.
template<typename ResultType>
void examplFunction_impl(std::function<ResultType()> func, std::function<void(ResultType)> func2) {
auto x = func();
func2(x);
}
template<class F1, class F2>
void examplFunction(F1&& f1, F2&& f2)
{
using ResultType = decltype(f1());
examplFunction_impl<ResultType>(std::forward<F1>(f1), std::forward<F2>(f2));
}
Демо
В этом случае вам требуется, чтобы f1
был вызван без аргументов, чтобы вы могли выяснить тип возвращаемого значения в вспомогательной функции. Затем вы вызываете реальную функцию, явно указав этот тип возвращаемого значения.
Вы могли бы добавить SFINAE , чтобы убедиться, что эта функция участвует только в разрешении перегрузки, когда f1
действительно может быть вызван подобным образом (и если f2
также может быть вызвано с возвращаемым значением f1
).
Хотя я должен согласиться с @Angew, что в данном примере в std::function
нет необходимости. Конечно, в реальной ситуации это может отличаться.