參考,例如,該段從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