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ですか? この機能は非常に明白であるため、見逃すことはできません。誰かがその 3 番目のパラメーターを必須にする正当な理由がありました。

( 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 に答える