2017-08-19 8 views
7

私はthrought T.1 CppCoreGuidelinesのつもりだし、次の例があるコードの抽象度を上げるためのテンプレートの使用?例上記のガイドラインを1として

例1

template<typename T> 
    // requires Incrementable<T> 
T sum1(vector<T>& v, T s) 
{ 
    for (auto x : v) s += x; 
    return s; 
} 

例2

template<typename T> 
    // requires Simple_number<T> 
T sum2(vector<T>& v, T s) 
{ 
    for (auto x : v) s = s + x; 
    return s; 
} 

は概念的には悪いですそれは一般化(「増やすことができる」または「追加することができる」という低レベルの概念に制約される)の機会を見逃したためです。

一般化されたテンプレートと呼ばれるためには、上記のテンプレートをどのように表現できますか?

+0

なぜ 's = std :: accumulate(std :: begin(v)、std :: end(v)、s)'を使わないのですか?標準コンテナ(およびバニラCスタイルの配列)で動作し、 's'に依存せず、' v'の要素も同じ型です(追加する必要はありますが)。私はそれがあなたの例よりもはるかに一般的であることを示唆しています - そして、 'std :: accumulate()'は他のものにも使用できます。 – Peter

答えて

5

悪いことは(コメントされた)概念にあります。あまり具体的ではなく、実装にリンクされています。Incrementable<T>は、+=の場合にのみ、オペレータ+=Simple_number<T>に制限します。

彼らはあなたが他のことである実装を置き換えることができます...

を操作+のより完全なセット、+==を、提供「算術」の正しい概念を提供しています。

さらにvector<T>を「range_view<T>」に置き換えてください。

ここでの実装ではなく、という概念です。 STLから

いくつかのアルゴリズムは、operator ==の存在に依存しているが、operator !=を必要としない、または十分にそれらを総称ない作るoperator <なくoperator >の存在を必要とします。

Orderable<T>のコンセプトは、HaveLess<T>より一般的です。

ほとんどのアルゴリズムは、タイプのいくつかの要件に依存しているが、それは論理的conterpart

+0

テンプレートの場合は+ =または+と=のどちらかが優先されます。違いはありませんか? –

0

標準ライブラリは良い実装を持っている必要がありますhttp://en.cppreference.com/w/cpp/algorithm/accumulate

それは、2つのバージョンなので、バイナリファンクタを取るものを持っていますoperator+なしで物事を合計することができます。

イテレータを使用するので、ベクトルだけでなく、反復可能なコンテナを合計できます。

結果の型をコンテナの値の型と異ならせることができます。たとえば、vector<float>の合計を精度向上のためdoubleに格納することができます。

また、質問の範囲ベースのfor(auto)ループで言える以上の値をコピーすることはありません。

+0

あなたがOPによって与えられたリンクに従うなら、それは批判されている部分ではなく、その概念です。 – Jarod42

+0

私はちょうどテキストと混乱していましたが、+ =と+、= –

関連する問題