cplusplus.comからこのスニペットには、例えば、参照:別のテンプレート型引数を使用するのではなく、テンプレート関数でiterator_traitsを使用するのはなぜですか?
はtemplate <class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, const T& val)
{
typename iterator_traits<InputIterator>::difference_type ret = 0;
while (first!=last) {
if (*first == val)
++ret;
++first;
}
return ret;
}
疑問は、なぜ、むしろ別のテンプレート引数に取るよりも、この文脈でiterator_traits
を使用している、ここで示したように:
template <class InputIterator, class T, class DiffType>
DiffType count(InputIterator first, InputIterator last, const T& val)
{
DiffType ret = 0;
while (first!=last) {
if (*first == val)
++ret;
++first;
}
return ret;
}
かなり幅広いですが、イテレータの特性、実際には一般的な(メンバータイプのような)特性は適切な規則でうまくいきます。習慣によって「標準」特性を使うことで、アルゴリズムとデータ構造が標準のテンプレートライブラリとうまくやりとりされ、より良いメタプログラミングが可能になります。 – AndyG
もう1つのテンプレートクラス*を定義することはできますが、一度やり直すと、1つの異なるアルゴリズムごとにもう一度やりたいとは思わないでしょう。 –
私は密度が高いかもしれませんが、あなたが考えているものの例を与えることができますか?あなたの最後の文で? – Quentin