2014-11-15 113 views
0

我有一個抽象基類:如何幫助模板類型推斷

template<class T> 
class Iterator 
{ 
    public: 
    virtual T operator*() = 0; 
    ... 
}; 

而且我有一個具體子類

template<class T, 
     template<class, class> class Col, 
     class Alloc = std::allocator<T>> 
class StdIterator final: virtual public Iterator<T> 
{ 
    typedef typename Col<T, Alloc>::iterator std_iterator; 
    std_iterator b, e; 
    public: 
    StdIterator(Col<T, Alloc>); 
    StdIterator(std_iterator, std_iterator); 
    T operator*() const override; 
    ... 
}; 

調用點,我有這樣的代碼StdIterator<int, std::vector> x (a_std_vector)。 如何將呼叫站點更改爲StdIterator<std::vector<int>>> x (a_std_vector),並根據std::vector的模板參數將其綁定爲T?我仍然需要T,Col和Alloc都被束縛在課堂的內部。

除此之外,我的代碼將只適用於std :: vectors,而不是std :: sets等。我嘗試過使用variadic類模板來獲得該功能,但我甚至不能讓它編譯。

回答

1

標準容器有value_type的typedef,所以你可能會使用類似:

template<class C> 
class StdIterator final: virtual public Iterator<typename C::value_type> 
{ 
    typedef typename C::iterator std_iterator; 
    // your stuff 
};