C++11 result_of 推断我的函数类型失败

C++11 result_of deducing my function type failed

我正在尝试以下程序:

#include<type_traits>
using namespace std;
template <class F, class R = typename result_of<F()>::type>
R call(F& f) { return f(); }
int answer() { return 42; }

int main()
{
    call(answer); 
    return 0;
}

"call(answer)"编译失败

VC 说 'R call(F&)' 无法推导出 'R'

的模板参数

GCC 说 |注意:模板参数 deduction/substitution 失败:|错误:函数返回函数

我不确定 "function name" 是否可以用于模板。我哪里错了,如何让我的电话(接听)工作?

我想你可以避免使用第二个模板参数并使用 autodecltype() 的组合。

类似

#include<type_traits>

using namespace std;

template <class F>
auto call(F& f) -> decltype( f() )
 { return f(); } 

int answer()
 { return 42; }

int main()
{
    call(answer); 

    return 0;
}

如果你(当你)可以使用 C++14,你可以简单地使用 auto

template <class F>
auto call(F& f)
 { return f(); } 

p.s.: 抱歉我的英语不好

您正在调用 f 作为左值,因此:

template <class F, class R = typename result_of<F&()>::type>
//                                               ^
R call(F& f) { return f(); }

您可以在这些情况下使用转发引用:

#include<type_traits>
#include<utility>
#include<cassert>

using namespace std;

template <class F, class R = typename result_of<F()>::type>
R call(F&& f) { return std::forward<F>(f)(); }

int answer() { return 42; }

int main()
{
    assert(call(answer) == 42);
    return 0;
}

通常可以避免麻烦。

就是说,@T.C 很好地解释了为什么您的代码不起作用。在他的回答中。
另请参阅对此问题的评论以获取更多详细信息。