Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ typedefing函数返回类型_C++_Templates_C++11 - Fatal编程技术网

C++ typedefing函数返回类型

C++ typedefing函数返回类型,c++,templates,c++11,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; } 编辑:我仅限于C++11编译器 谢谢正如评论所说,有一个黑客: template <class T, t

假设我有一个返回依赖类型的模板函数。比如:

template <class T>
typename std::result_of<T()>::type
foo()
{
    std::result_of<T()>::type retVal;
    // Some mind blowing code...
    return retVal;
}
编辑:我仅限于C++11编译器


谢谢

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

template <class T, typename Ret = std::result_of_t<T()>>
Ret foo() {
  Ret retVal;
  return retVal;
}
模板
Ret foo(){
Ret-retVal;
返回返回;
}
或者,如果您的编译器足够新,您也可以简单地使用返回类型推断:

template <class T>
auto foo() {
  std::result_of_t<T()> retVal;
  return retVal;
}
模板
自动foo(){
std::检索结果;
返回返回;
}

正如评论所说,有一种黑客行为:

template <class T, typename Ret = std::result_of_t<T()>>
Ret foo() {
  Ret retVal;
  return retVal;
}
模板
Ret foo(){
Ret-retVal;
返回返回;
}
或者,如果您的编译器足够新,您也可以简单地使用返回类型推断:

template <class T>
auto foo() {
  std::result_of_t<T()> retVal;
  return retVal;
}
模板
自动foo(){
std::检索结果;
返回返回;
}

您可以使用设置为
std::result\u of::type
的模板参数,如:

template <class T, class Ret = typename std::result_of<T()>::type>
Ret foo()
{
    Ret retVal = 100;
    // Some mind blowing code...
    return retVal;
}
模板
Ret foo()
{
Ret-retVal=100;
//一些令人兴奋的代码。。。
返回返回;
}

您可以使用设置为
std::result\u of::type
的模板参数,如:

template <class T, class Ret = typename std::result_of<T()>::type>
Ret foo()
{
    Ret retVal = 100;
    // Some mind blowing code...
    return retVal;
}
模板
Ret foo()
{
Ret-retVal=100;
//一些令人兴奋的代码。。。
返回返回;
}

这不是我们允许通过
使用
的模板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;
}
模板
使用Ret=typename std::result\u of::type;
模板
Ret foo()
{
Ret-retVal;
//一些令人兴奋的代码。。。
返回返回;
}


如果您不接受默认模板参数的传统C++98/03解决方案,也不接受使用
别名向作用域添加
的C++11解决方案,也不能使用
自动
返回类型推断的C++14解决方案,那么就没有解决方案了。

这不是我们允许通过
使用
来定义模板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;
}
template <class T>
typename std::result_of<T()>::type
foo()
{
    decltype(foo()) retVal;
    // Some mind blowing code...
    return retVal;
}
模板
使用Ret=typename std::result\u of::type;
模板
Ret foo()
{
Ret-retVal;
//一些令人兴奋的代码。。。
返回返回;
}

如果您不接受默认模板参数的传统C++98/03解决方案,也不接受使用
别名向作用域添加
的C++11解决方案,也不能使用
自动
返回类型推断的C++14解决方案,那么就没有解决方案。

模板
template <class T>
typename std::result_of<T()>::type
foo()
{
    decltype(foo()) retVal;
    // Some mind blowing code...
    return retVal;
}
typename std::result\u of::type foo() { decltype(foo())retVal; //一些令人兴奋的代码。。。 返回返回; }
模板
typename std::result\u of::type
foo()
{
decltype(foo())retVal;
//一些令人兴奋的代码。。。
返回返回;
}


尝试将其作为默认模板参数,或者如果您的编译器支持C++14,则可能是自动返回类型?@user3514538考虑过了。。。但是调用方将能够覆盖此值。我需要
static\u断言第二个参数确实是我想要的参数(仍然需要写入两次返回类型…):(@oLen Nope…恐怕C++14是不可能的…这个问题没有一个完美的解决方案-如果有,委员会可能不会为返回类型添加
auto
。我会使用默认模板参数,如果调用方出错…他们应该阅读文档。尝试将其作为默认模板如果编译器支持C++14,meterOr可能是自动返回类型?@user3514538考虑过了……但是调用方将能够覆盖此值。我需要
static\u断言
第二个参数确实是我想要的参数(仍然需要写两次返回类型…):(@oLen Nope…恐怕C++14是不可能的…这个问题没有完美的解决方案-如果有,委员会可能不会为返回类型添加
auto
。我会使用默认的模板参数,如果调用方出错…他们应该阅读文档。谢谢。请参阅我上面的评论。
auto
是不可能的(C++14功能),并且默认参数有点问题。@用户:那么您应该将这些要求添加到您的问题中。@T.C:衰退是必须发生的事情,因为他没有转发
T
运算符()的结果。谢谢。请看我上面的评论。
auto
是不可能的(C++14功能),默认参数有点问题。@user:那么你应该将这些要求添加到你的问题中。@T.C:衰减是必须发生的事情,因为他没有转发
T
运算符()的结果。是的,但该类型对包含此头文件的每个人都可见。正如我在问题中所说的,我更喜欢避免这种情况……我不喜欢此解决方案的唯一一件事是它将
Ret
添加到全局范围。如果您希望使用另一个头文件进行此操作,并且希望
Ret
成为不同的内容,那么您必须来使用另一个名称。@NathanOliver:然后将其粘贴到详细名称空间或其他任何名称中。是的,但该类型对包含此头文件的所有人都可见。正如我在问题中所说,我更愿意避免…我不喜欢此解决方案的唯一一点是它将
Ret
添加到全局范围。如果您希望使用另一个,想要成为不同的东西,你必须想出另一个名字。@NathanOliver:然后把它放在一个详细的名称空间或其他什么地方。正如所问的,这是一个很好的解决方案。如果foo在现实中有很多复杂的参数,它就不会那么好了。但无论如何,你要有一个更高的投票权。正如所问的,这是一个聪明的解决方案如果foo在现实中有很多复杂的论点,那就不太好了。但无论如何,还是要投赞成票。