2011-12-28 84 views
0

我正在尋找如何設計多類型在C++中使用模板的泛型算法的指導原則。C++多類型模板使用指南

我重新出現的問題是,是否例如,寫一個降低般的功能很喜歡這個

template <typename Container, typename Element> 
E reduce_something(const Container<Element> & a) 
{ 
    // ... 
} 

或跳過元素類型這樣

template <typename Container> 
Container::element_type reduce_something(const Container & a) 
{ 
    // ... 
} 

並且當使用嵌套模板

回答

1

您是否考慮過傳入和返回一個或多個迭代器類型的規範C++方法?在這種情況下,傳入start和end來指定範圍,併爲返回值使用相同類型或不同的迭代器類型。

2

我通常會盡力確保對模板類型的要求和限制儘可能少,因爲我可以合理地將其作爲指導原則。

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) 
{ 
    // ... 
} 

已經有一個合適的標準性狀類和算法將與子範圍,由指針和容器的所有方式分隔的範圍工作。