typedefing函数返回类型

时间:2015-12-21 15:34:59

标签: c++ templates c++11

假设我有一个返回依赖类型的模板函数。类似的东西:

template <class T>
typename std::result_of<T()>::type
foo()
{
    std::result_of<T()>::type retVal;
    // Some mind blowing code...
    return retVal;
}

正如你所看到的,我必须两次写入返回类型,一次是函数类型,另一次是为返回值声明一个局部变量。

有没有办法在函数签名中typedef这种类型,所以类型只会被声明一次(没有代码重复),只能在函数内部(签名和正文)可见和使用? 像(警告!伪代码,请不要生气或受到启发):

template <class T>
typedef typename std::result_of<T()>::type FooReturnType
FooReturnType foo()
{
    FooReturnType retVal;
    // Some mind blowing code...
    return retVal;
}

编辑:我仅限于C ++ 11编译器。

由于

4 个答案:

答案 0 :(得分:3)

template <class T>
typename std::result_of<T()>::type
foo()
{
    decltype(foo()) retVal;
    // Some mind blowing code...
    return retVal;
}

答案 1 :(得分:2)

正如评论所说,有这个黑客:

template <class T, typename Ret = std::result_of_t<T()>>
Ret foo() {
  Ret retVal;
  return retVal;
}

或者,如果您的编译器足够新,您可以简单地使用返回类型推导:

template <class T>
auto foo() {
  std::result_of_t<T()> retVal;
  return retVal;
}

答案 2 :(得分:1)

您可以使用设置为std::result_of<T()>::type的模板参数,如:

template <class T, class Ret = typename std::result_of<T()>::type>
Ret foo()
{
    Ret retVal = 100;
    // Some mind blowing code...
    return retVal;
}

Live Example

答案 3 :(得分:1)

这不是我们通过using允许模板typedef的原因吗?

template<typename T>
using Ret = typename std::result_of<T()>::type;

template<typename T>
Ret<T> foo()
{
    Ret<T> retVal;
    // Some mind blowing code...
    return retVal;
}

如果您不接受默认模板参数的传统C ++ 98/03解决方案,并且您不接受向范围添加using别名的C ++ 11解决方案,以及您不能使用auto返回类型推导的C ++ 14解决方案,那么就没有解决方案。