在模板中获取函数返回类型

时间:2016-12-23 12:28:00

标签: c++ templates c++14

如何为传递给模板的任何函数获取返回类型?
我不知道如何在import os path = "/Users/Desktop/test/" for filename in os.listdir(path): filepath = os.path.join(path, filename) with open(filepath, 'rU') as f: content = f.read() print(filepath) print(content) print() 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; } 中获取类型Result

1 个答案:

答案 0 :(得分:14)

一种可能的解决方案是使用提取返回类型的函数声明以及所有参数。你甚至没有定义它 它遵循一个最小的工作示例:

#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;
}

如您所见,为ret提供的声明与提交的函数或成员函数具有相同的返回类型。
剩下的就是decltype