使用std :: result_of确定模板参数的返回类型

时间:2015-07-26 14:17:31

标签: c++ templates c++11

我认为代码片段是自解释的,但基本上模板函数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的副本,但已接受的解决方案对我来说并不起作用(至少,据我所知,我已将解决方案纳入我的代码中)。

3 个答案:

答案 0 :(得分:4)

您拥有的功能是int f(int i),但您正在调用未知的F()std::result_of<F()>::type应为std::result_of<F(T)>::type

Live Example

答案 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))