Search code examples
c++functionc++17return-typecompile-time

Simplest way to determine return type of function


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


Solution

  • You can leverage std::function here which will give you an alias 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)>;
    

    This technique only works if the function is not overloaded or the function do not have multiple operator()'s defined.