参考,例如,该段从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
另一个模板类*可以被定义,但是一旦我们完成了一次,我们不想再为每一个不同的算法重新做它 –
我可能是密集的,但你能举一个你在想什么的例子吗?你最后一句话? – Quentin