#include <tuple>
#include <functional>
#include <string>
// takes an arbitrary tuple of std::functions and creates a
// tuple of the return types of those std::functions
template<class T, class... Types>
struct TupleHandler;
// handles the recursive inheritance base case when all the
// elements of the tuple have been processed
template<class... Types>
struct TupleHandler<std::tuple<>, Types...> {
using ReturnTypeTuple = std::tuple<Types...>;
};
// Strips off the first std::function in the tuple, determines
// its return type and passes the remaining parts on to have the next element
// processed
template<class Return, class... Rest, class... Tail, class... Types>
struct TupleHandler<std::tuple<std::function<Return(Rest...)>, Tail...>, Types...> : TupleHandler<std::tuple<Tail...>, Types..., Return> {
using ReturnTypeTuple = typename TupleHandler<std::tuple<Tail...>, Types..., Return>::ReturnTypeTuple;
};
int main()
{
std::tuple<std::function<int(int)>, std::function<std::string(double)>> funcs;
// Of course for this simple use case you could have just used std::make_tuple, but it still demonstrates the solution
TupleHandler<decltype(funcs)>::ReturnTypeTuple return_value_tuple(std::get<0>(funcs)(1), std::get<1>(funcs)(4.4));
// added per comment
auto x = [](auto funcs){ typename TupleHandler<decltype(funcs)>::ReturnTypeTuple results; };
}