我正在尝试下面的程序:
#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提示|注意:模板参数演绎/替换失败:|错误:函数返回函数
我不确定"函数名"是否可以用于模板。我哪里出错了,如何让我的电话(回答)工作?
在以下情况下可以使用转发引用:
#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;
}
通常可以避免麻烦。
也就是说,@ tc很好地解释了为什么你的代码不能工作。在他的回答中。
您将f
调用为左值,因此:
template <class F, class R = typename result_of<F&()>::type>
// ^
R call(F& f) { return f(); }
我想你可以避免第二个模板参数,并使用auto
和decltype()
的组合。
#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(); }
注。