gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:00 25 4
gpt4 key购买 nike

如何获取传递给模板的任何函数的返回类型?
我不知道如何在 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

最佳答案

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

#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 完成剩下的工作。

关于c++ - 获取模板中的函数返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41301536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com