[英]How to get the return type of a function with std::result_of?
[英]C++14 'auto' is able to get function return type, do we still need std::result_of<>?
似乎C ++ 14 auto
关键字可用于出现在函数定义的位置以指示返回类型。 在这种情况下,还需要std::result_of
吗? 现在不是过时了吗?
是的,一点没错。
有时,您需要返回类型,而不是函数的结果。 假设我有一个vector<X>
,我想对每个元素应用一个函数并返回结果。 此操作称为map
或fmap
,我们可以这样实现签名:
template <class T, class F, class U = std::decay_t<std::result_of_t<F&(T const&)>>> std::vector<U> map(std::vector<T> const&, F );
您可以将返回类型设置为auto
,但是无论如何,您都需要计算该类型U
而auto
不会将其提供给您。 每当您希望函数调用的结果不一定是返回类型时, auto
都不会削减它。
SFINAE。 考虑以下两者之间的区别:
template <class F> decltype(auto) foo(F f) { return f(0); } template <class F> std::result_of_t<F&(int)> bar(F f) { return f(0); }
如果F
不能用int
调用,则实例化foo()
是一个硬编译错误,但是bar()
只会从重载集中删除。 这在通用代码中非常有价值,因为您可以测试表达式的格式。
注解。 auto
不会告诉您有关函数返回类型的任何信息。 如果函数返回调用带有一些参数的可调用函数的结果,则std::result_of_t<F(A, B)>
本身会告诉我该函数在做什么。 auto
告诉我什么。
确实更好的问题可能是...如果我们有decltype
为什么我们需要std::result_of
。 这些似乎更紧密相关。 毕竟,我可以做decltype(x+1)
,如何用result_of
呢! decltype
类型显然更好。 好吧,事实证明,即使在确定函数调用的结果时, 两者之间也存在一些细微的差异 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.