推导独立函数的返回类型

时间:2015-05-19 03:27:21

标签: c++ templates c++11

我试图找出非成员函数的返回类型。我首先想到std::result_of完成了这项工作,但看起来后者只适用于可调用对象。特别是std::result_of<decltype(f)>::type is 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,它接受​​一个指向我想要推断出返回类型的函数的指针,然后返回一个&#34; helper&#34;结构,我从中读取实际的返回类型。

代码似乎有点复杂,因为它涉及一个调用函数(虽然没有执行实际的评估)。有没有其他更简单,更清晰/更短的方法呢?

3 个答案:

答案 0 :(得分:6)

咨询我自己的old blog posting,我发现:

template< class Func >
struct ResultOf
{
    typedef typename std::function<
        typename std::remove_pointer<Func>::type
        >::result_type T;
};

答案 1 :(得分:3)

template<typename>
struct return_t_impl;

template<typename Ret, typename... Args>
struct return_t_impl <Ret(Args...)> 
{
   using type = Ret;
};

template<typename Ret, typename... Args>
struct return_t_impl<Ret(*)(Args...)> : return_t_impl<Ret(Args...)> {};

template<typename T>
using return_t = typename return_t_impl<T>::type;

并将其用作:

using type = return_t<decltype(f)>; //type is void

答案 2 :(得分:2)

template<class F>
using return_t = typename std::function<std::remove_pointer_t<std::decay_t<F>>>::result_type;