How can one get return type of a class member function using std::invoke_result_t in C ?
#include <type_traits>
#include <vector>
template <class T>
struct C
{
auto Get(void) const { return std::vector<T>{1,2,3}; }
};
int main(void)
{
// what should one put below to make x to have type std::vector<int> ?
std::invoke_result_t<C<int>::Get, void> x;
// ^^^^^^^^^^^^^^^^^
return 0;
}
Thank you very much for your help!
CodePudding user response:
std::invoke_result_t
works on types, but C<int>::Get
is not a type. It is a non-static member function.
The type of C<int>::Get
is std::vector<int>(C<int>::)()
: Member function of C<int>
that returns std::vector<int>
and accepts no parameters. That type is what you need to give to std::invoke_result_t
. Or rather, a pointer to it, since you can't pass raw member function types around.
Also, std::invoke_result_t
treats the first argument type as the type of object on which to call the member function when it's dealing with pointers to member functions.
Thus you need:
std::invoke_result_t<std::vector<int>(C<int>::*)(), C<int>>
Or, if you don't want to write out the whole member function type:
std::invoke_result_t<decltype(&C<int>::Get), C<int>>
Sidenote: void
parameter lists are equivalent to empty parameter lists in C . There's no reason to explicitly specify a void
parameter list in C unless you want to share a function declaration with C code.