Здесь вы можете использовать std::function
, что даст вам typedef для типа возвращаемого значения функции.Для этого требуется поддержка C ++ 17, так как он опирается на вычет аргумента шаблона класса , но он будет работать с любым вызываемым типом:
using ReturnTypeOfFoo = decltype(std::function{foo})::result_type;
Мы можем сделать этонемного более общий, как
template<typename Callable>
using return_type_of_t =
typename decltype(std::function{std::declval<Callable>()})::result_type;
, который затем позволяет использовать его как
int foo(int a, int b, int c, int d) {
return 1;
}
auto bar = [](){ return 1; };
struct baz_
{
double operator()(){ return 0; }
} baz;
using ReturnTypeOfFoo = return_type_of_t<decltype(foo)>;
using ReturnTypeOfBar = return_type_of_t<decltype(bar)>;
using ReturnTypeOfBaz = return_type_of_t<decltype(baz)>;