假设我有一个返回依赖类型的模板函数。类似的东西:
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编译器。
由于
答案 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;
}
答案 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解决方案,那么就没有解决方案。