我认为代码片段是自解释的,但基本上模板函数ExecFunc
应该能够执行另一个函数并返回其结果。我知道我可以使用decltype
代替result_of
来获得类似的结果,但这个问题是要理解为什么我写的内容不起作用:该代码段没有在gcc v4.9.2上编译。
这就是我所拥有的:
#include <type_traits>
int f(int i)
{
return i;
}
template<class F, class T>
auto ExecFunc(F f, T arg) -> typename std::result_of<F()>::type
{
return f(arg);
}
int main() {
auto a = ExecFunc(f, 3);
return 0;
}
这是编译器输出:
prova.cpp: In function ‘int main()’:
prova.cpp:15:26: error: no matching function for call to ‘ExecFunc(int (&)(int), int)’
auto a = ExecFunc(f, 3);
^
prova.cpp:15:26: note: candidate is:
prova.cpp:9:6: note: template<class F, class T> typename std::result_of<F()>::type ExecFunc(F, T)
auto ExecFunc(F f, T arg) -> typename std::result_of<F()>::type
^
prova.cpp:9:6: note: template argument deduction/substitution failed:
prova.cpp: In substitution of ‘template<class F, class T> typename std::result_of<F()>::type ExecFunc(F, T) [with F = int (*)(int); T = int]’:
prova.cpp:15:26: required from here
prova.cpp:9:6: error: no type named ‘type’ in ‘class std::result_of<int (*())(int)>’
N.B。 这个问题可能看起来像是this one的副本,但已接受的解决方案对我来说并不起作用(至少,据我所知,我已将解决方案纳入我的代码中)。
答案 0 :(得分:4)
您拥有的功能是int f(int i)
,但您正在调用未知的F()
。 std::result_of<F()>::type
应为std::result_of<F(T)>::type
。
答案 1 :(得分:2)
问题在于result_of
的参数,它应该是:
-> typename std::result_of<F(T)>::type
答案 2 :(得分:0)
这是使用decltype
template<class F, class T>
auto ExecFunc(F f, T arg) -> decltype(f(arg))