【发布时间】:2015-05-19 13:22:30
【问题描述】:
我正在尝试找出非成员函数的返回类型。我首先认为std::result_of 可以完成这项工作,但看起来后者仅适用于可调用对象。特别是std::result_of<decltype(f)>::typeis not working。我终于设法想出了一些有效的代码
#include <iostream>
#include <typeinfo>
void f(int); // we deduce the returning type of this function
template<typename Ret, typename... Args>
struct Helper
{
using type = Ret;
};
template<typename Ret, typename... Args>
Helper<Ret, Args...> invoke(Ret(*fp)(Args...))
{
return {};
}
template<typename Ret, typename... Args>
using Return_Type = typename Helper<Ret, Args...>::type;
int main()
{
std::cout << typeid(decltype(invoke(f))::type).name() << std::endl; // fine
}
我在这里使用了一个额外的函数,模板invoke,它接受一个指向我要推断返回类型的函数的指针,并返回一个“帮助器”结构,我从中读取实际的返回类型。
代码看起来有点复杂,因为它涉及一个调用函数(尽管没有执行实际的评估)。还有其他更简单、更清晰/更短的方法吗?
【问题讨论】:
-
我猜你不想使用
decltype(f(0))。 -
不,因为
f可以有可变/未知数量的参数,并且希望某些功能适用于任何功能。 -
result_of可以很好地处理函数指针。result_of<decltype(&f)(int)>::type是void。您只是使用不当,目的不同。 -
@Yakk 可能我的问题不是很清楚。我想仅从名称推断返回类型,而不必指定参数列表。