我刚刚编写了一个小帮助函数作为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
的现有重载?功能显得如此明显,以至于不容忽视;有人有充分理由强制要求第三个参数。
(另请参阅Understanding std::accumulate - 我理解为什么你希望能够提供初始值,我只是不明白为什么它是强制性的)
答案 0 :(得分:7)
这样可以推导出模板参数。
宣言是
template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );
,推断返回值的唯一参数是init
。因为不必须是迭代器的值类型。
是的,它仍然可以默认到std::iterator_traits<InputIt>::value_type()
。委员会可能根本就没有想到这一点。