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

问题描述 投票:0回答:2

如何获取传递给模板的任何函数的返回类型?
我不知道如何在

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
中获取类型
print_name

c++ templates c++14
2个回答
29
投票

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

#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
完成。


10
投票

从 C++ 17 开始,答案是

std::invoke_result_t<T>
© www.soinside.com 2019 - 2024. All rights reserved.