2011-11-01 84 views
2

我想知道下面的部分專業化,我定義基於通用列表模板的有序和無序列表,是這樣做的正確,有效的方式。模板專業化爲類標記

template <typename T, bool O> class List;          
template <typename T> class UList: public List<T,false>{};      
template <typename T> class OList: public List<T,true>{}; 

感謝,

+0

分不清不知道'List'是如何實現的。使用定義元素插入方式的策略可能會更好。 – Nim

+0

列表實現如何影響決策? – perreal

+0

我們如何知道它是否有效(或正確)或不知道它是如何實現的? – Nim

回答

1

我想你想通過減少模板參數爲哪些用戶會在他們的代碼最終使用的類的數量,以減少類模板的通用性。如果是這樣的話,那麼在C++ 03和C++ 98中,這就是你可以做的,即定義較不通用的類,該類來自更通用的類。

但是,在C++ 11中,您不需要定義新的類模板。相反,你可以創建template aliases,減少模板參數的數量在同一時間爲:

template <typename T> 
using UList = List<T,false>;      

template <typename T> 
using OList = List<T,true>; 

而且使用UListOList,就好像它是一個類模板這需要一個類型參數:

UList<int> uints; 
OList<float> ofloats; 

wiki,我剛剛得知這個新的方式來定義類型/別名,我們使用之前使用typedef做:

的使用語法也可以用來作爲類型混淆在C++ 11:

typedef void (*Type)(double);   // Old style 
using OtherType = void (*)(double); // New introduced syntax 
3

這樣的事情,我會用一個策略類來定義事情是如何插入到一個列表,例如

struct DefaultInsertionPolicy 
{ 
    template <typename ContainerType, typename ValueType> 
    static void insert(ContainerType& container, ValueType const& cValue) 
    { 
    container.insert(container.end(), cValue); 
    } 
}; 

struct SortedInsertionPolicy 
{ 
    template <typename ContainerType, typename ValueType> 
    static void insert(ContainerType& container, ValueType const& cValue) 
    { 
    // I'm using lower_bound here, but do what is necessary for you 
    typename ContainerType::iterator ft = std::lower_bound(container.begin(), container.end(), cValue); 
    container.insert(ft, cValue); 
    } 
}; 

template <typename T, typename InsertPolicy = DefaultInsertionPolicy> 
class List 
{ 
    : 
    // insert function 
    void insert(T const& cValue) 
    { 
    InsertPolicy::insert(*this, cValue); // delegate to the policy to do the insert 
    } 

    void insert(iterator iPos, T const& cValue) 
    { 
    // do the real insertion at the provided position. 
    } 
}; 

所以真正的類型可能是

typedef List<some_type> UList; // insertion order 
typedef List<some_type, SortedInsertionPolicy> OList; // sorted list 
+0

+1用於引入基於策略的設計。 – Nawaz