我在理解std::result_of
C ++ 0x 的需求时遇到了一些麻烦。如果我理解正确,result_of
它用于获得使用某些类型的参数调用函数对象的结果类型。例如:
template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
return f(a);
}
我看不出以下代码有什么区别:
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
return f(a);
}
要么
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
return f(a);
}
我可以用这两种解决方案看到的唯一问题是我们需要:
- 有一个仿函数的实例,以在传递给decltype的表达式中使用它。
- 知道函子的已定义构造函数。
我是否正确地认为decltype
和之间的唯一区别result_of
是第一个需要表达而第二个不需要?
decltype
它不仅丑陋而且功能强大。result_of
只能用于可调用的类型,并且需要类型作为参数。例如,您不能result_of
在这里使用:template <typename T, typename U> auto sum( T t, U u ) -> decltype( t + u );
如果参数可以是算术类型(没有F
可以定义的函数F(T,U)
表示t+u
。对于用户定义的类型,可以这样)(同样,我还没有真正使用过)这对成员方法的调用可能很难有做result_of
不使用粘合剂或lambda表达式