我通常會盡力確保對模板類型的要求和限制儘可能少,因爲我可以合理地將其作爲指導原則。
template <typename Container, typename Element>
E reduce_something(const Container<Element> & a)
{
// ...
}
這是不正確的,那就需要是這樣的:
template < template<typename> class Container, typename Element>
Element reduce_something(const Container<Element> & a)
{
// ...
}
但是,這增加了很多的要求,對Container
。它只能使用一個模板參數,所以像std::vector
這樣的東西不能做,因爲它有一個分配器模板參數。我可以用一個非模板類型Container
來編寫一個模板函數,而不會假定它是一個模板類型,並且如果我想在模板實例化時想與之交互的操作,則無論如何一切都會起作用。
template <typename Container>
Container::element_type reduce_something(const Container & a)
{
// ...
}
此補充說,Container
必須包含element_type
類型成員的一個關鍵要求。最好使用traits類,以便可以爲標準容器(其中有value_type
)以及其他不能直接修改的類型創建特徵。
可能更好的方法是採用由迭代器分隔的範圍。例如。
#include <iterator>
template<InputIterator>
typename std::iterator_traits<InputIterator>::value_type
reduce_something(InputIterator first, InputIterator last)
{
// ...
}
已經有一個合適的標準性狀類和算法將與子範圍,由指針和容器的所有方式分隔的範圍工作。