C++14 'auto' 可以得到函数 return 类型,我们还需要 std::result_of<> 吗?
C++14 'auto' is able to get function return type, do we still need std::result_of<>?
好像C++14可以用auto
关键字出现在函数定义的位置来表示return类型。这样的话,还需要std::result_of
吗?现在不是过时了吗?
是的,绝对。
有时您需要 return 类型,但不是函数的结果。假设我有一个 vector<X>
并且我想对每个元素应用一个函数并且 return 结果。这个操作称为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 );
您可以将 return 类型设为 auto
,但无论如何,您需要计算该类型 U
而 auto
不会将其提供给您。任何时候你想要一个不一定是 return 类型的函数调用的结果,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
没有告诉您有关函数 return 类型的任何信息。如果该函数是 returning 调用一个带有一些参数的可调用函数的结果,std::result_of_t<F(A, B)>
本身就告诉我该函数在做什么。 auto
什么也没告诉我。
真正更好的问题可能是...如果我们有 decltype
,为什么我们需要 std::result_of
。那些似乎更密切相关。毕竟我可以decltype(x+1)
,我怎么用result_of
来表达呢?! decltype
显然更好。好吧,事实证明,即使在确定函数调用的结果时,两者之间也存在 some slight differences。
好像C++14可以用auto
关键字出现在函数定义的位置来表示return类型。这样的话,还需要std::result_of
吗?现在不是过时了吗?
是的,绝对。
有时您需要 return 类型,但不是函数的结果。假设我有一个
vector<X>
并且我想对每个元素应用一个函数并且 return 结果。这个操作称为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 );
您可以将 return 类型设为
auto
,但无论如何,您需要计算该类型U
而auto
不会将其提供给您。任何时候你想要一个不一定是 return 类型的函数调用的结果,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
没有告诉您有关函数 return 类型的任何信息。如果该函数是 returning 调用一个带有一些参数的可调用函数的结果,std::result_of_t<F(A, B)>
本身就告诉我该函数在做什么。auto
什么也没告诉我。
真正更好的问题可能是...如果我们有 decltype
,为什么我们需要 std::result_of
。那些似乎更密切相关。毕竟我可以decltype(x+1)
,我怎么用result_of
来表达呢?! decltype
显然更好。好吧,事实证明,即使在确定函数调用的结果时,两者之间也存在 some slight differences。