Tom*_*shu 6 c++ templates c++14
如何为传递给模板的任何函数获取返回类型?
我不知道如何转换template<typename T>和template<typename Result, typename Args...>:
template<typename T>
void print_name(T f)
{
static_assert(internal::is_function_pointer<T>::value
|| std::is_member_function_pointer<T>::value,
"T must be function or member function pointer.");
typename decltype(f(...)) Result; // ???
typename std::result_of<T>()::type Result; // ???
printf("%s\n", typeid(Result).name());
}
void f_void() {}
int f_int(int x) { return 0; }
float f_float(int x, int y) { return 0.f; }
struct X { int f(int x, float y) { return 0; } };
int main()
{
print_name(f_void);
print_name(f_int);
print_name(f_float);
print_name(&X::f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得Result内部函数类型print_name?
sky*_*ack 15
一种可能的解决方案是使用函数声明来提取返回类型以及所有参数.你甚至没有定义它.
它遵循一个最小的工作示例:
#include<typeinfo>
#include<cstdio>
template<typename R, typename... A>
R ret(R(*)(A...));
template<typename C, typename R, typename... A>
R ret(R(C::*)(A...));
template<typename T>
void print_name(T f)
{
printf("%s\n", typeid(decltype(ret(f))).name());
}
void f_void() {}
int f_int(int x) { return 0; }
float f_float(int x, int y) { return 0.f; }
struct X { int f(int x, float y) { return 0; } };
int main()
{
print_name(f_void);
print_name(f_int);
print_name(f_float);
print_name(&X::f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,提供的声明ret与提交的函数或成员函数具有相同的返回类型.
A decltype完成其余的工作.
小智 12
std::invoke_result_t<T>
Run Code Online (Sandbox Code Playgroud)