是的,一点没错.
有时您需要返回类型,但不是函数的结果.假设我有一个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 );
Run Code Online (Sandbox Code Playgroud)
您可以创建返回类型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); }
Run Code Online (Sandbox Code Playgroud)
如果F
不能用a调用int
,则实例化foo()
是一个硬编译错误,但bar()
只是从重载集中删除.这在通用代码中非常有价值,因为您可以测试表达式是否良好.
注解.auto
没有告诉你关于函数返回类型的信息.如果函数返回调用带有一些args的一个callable的结果,std::result_of_t<F(A, B)>
那么它本身告诉我该函数正在做什么.auto
没告诉我什么.
真的是一个更好的问题可能是...... std::result_of
如果我们有,我们为什么需要decltype
.那些似乎更密切相关.毕竟,我能做到decltype(x+1)
,我怎么表达result_of
呢?!decltype
显然更好.好吧,事实证明,即使在确定函数调用的结果时,两者之间也存在一些细微的差别.
归档时间: |
|
查看次数: |
108 次 |
最近记录: |