Simplest way to determine return type of function

  • A+

Given a very simple, but lengthy function, such as:

int foo(int a, int b, int c, int d) {     return 1; }  // using ReturnTypeOfFoo = ??? 

What is the most simple and concise way to determine the function's return type (ReturnTypeOfFoo, in this example: int) at compile time without repeating the function's parameter types (by name only, since it is known that the function does not have any additional overloads)?


You can leverage std::function here which will give you a typedef for the functions return type. This does require C++17 support, since it relies on class template argument deduction, but it will work with any callable type:

using ReturnTypeOfFoo = decltype(std::function{foo})::result_type; 

We can make this a little more generic like

template<typename Callable> using return_type_of_t = typename decltype(std::function{std::declval<Callable>()})::result_type; 

which then lets you use it like

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)>; 


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: