7

我刚刚写了一个小辅助函数作为包装器std::accumulate

template <typename FwdIter> inline
auto accumulate(FwdIter begin, FwdIter end) -> std::iterator_traits<FwdIter>::value_type
{
    return std::accumulate(begin, end, std::iterator_traits<FwdIter>::value_type());
}

我可能在这里忽略了一些东西。为什么这不是现有的过载std::accumulate?该功能看起来如此明显,以至于不能被忽视;有人有充分的理由强制第三个参数。

(另请参阅了解 std::accumulate - 我理解您为什么想要提供初始值的能力,我只是不明白为什么它是强制性的)

4

1 回答 1

7

这样就可以推导出模板参数。

声明是

template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );

并且从中推断返回值的唯一参数是init。因为它不必迭代器的值类型。

是的,它仍然可以默认std::iterator_traits<InputIt>::value_type(). 委员会可能根本没有想到这一点。

PS:你把我和汽车搞混了。我认为它没有被添加,因为它在 C++03 中是不可能的,并且在 C++11 完成时被忽略了,因为它看起来不需要任何更改。但这里不需要;模板参数是在您在标准位置写入返回类型时声明的。

于 2013-09-09T08:59:15.783 回答