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" 是否可以用于模板。我哪里错了,如何让我的电话(接听)工作?
我想你可以避免使用第二个模板参数并使用 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(); }
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 很好地解释了为什么您的代码不起作用。在他的回答中。
另请参阅对此问题的评论以获取更多详细信息。
我正在尝试以下程序:
#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" 是否可以用于模板。我哪里错了,如何让我的电话(接听)工作?
我想你可以避免使用第二个模板参数并使用 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(); }
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 很好地解释了为什么您的代码不起作用。在他的回答中。
另请参阅对此问题的评论以获取更多详细信息。