2016-09-24 12 views
1

我想了解模板是如何工作的,而且我已經想出了這個問題。現在,我完全意識到它可以使用多態性來解決,但我很好奇,看看它是否可以通過使用模板來解決。情況如下:使用可變模板的成員的類

假設我有兩種類型的隊列,其被定義如下:

#include <queue> 
template <typename GenType, typename Comparator> 
class Priority 
{ 
public: 
    Priority() 
    { } 
    ~Priority() 
    { } 
    void insert(GenType const& t) 
    { mQueue.push(t); } 
private: 
    std::priority_queue<GenType, std::vector<GenType>, Comparator> mQueue; 
}; 

template<typename GenType> 
class FIFO 
{ 
public: 
    FIFO() 
    { } 
    ~FIFO() 
    { } 
    void insert(GenType const& t) 
    { mList.push_front(t); } 
private: 
    std::deque<GenType> mList; 
}; 

而現在,我有一個類,可以使用QueueFIFO(或任何其它類型隊列中的)所示:

// I'm not sure that this is how it should be declared... 
template <typename GenType, 
    template<typename, typename...> class List> 
class User 
{ 
public: 
    User() 
    { } 
    ~User() 
    { } 
    void add(GenType const& t) 
    { mList.insert(t); } 
private: 
    // This line gives an error. 
    List mList; 
}; 

因爲它的立場,標線給出了一個錯誤,這我理解,因爲我還沒有實際傳遞任何模板參數List。問題是我不知道如何解決這個錯誤。

給予一定的情況下,使用情況下這是能夠有User類採取任何類型的隊列,並可以像這樣使用:

User<int, FIFO> u1; 
// Not sure if it is this way: 
User<int, Priority, std::less<int>> u2; 
// Or this way: 
User<int, Priority, std::less> u2; 

如何解決這個任何建議問題?

+0

@ Rakete1111爲什麼是的,是的。我現在就解決它。 – Mauricio

回答

1

不要這樣做。

相反,讓您的User類模板採取它會使用容器的全型,而讓容器指出是哪一種類型的值:

template <typename Container> 
class User 
{ 
public: 
    using value_type = typename Container::value_type; // you'll have to add this 
                 // typedef to your containers 

    User() = default; 
    ~User() = default; 

    void add(value_type const& t) 
    { 
     mList.insert(t); 
    } 

private: 
    Container mList; 
}; 

這樣一來,我作爲你的班級模板的用戶可以提供正確的事情。如果我想用你的優先級隊列,我可以在比較空,我希望直接:

User<Priority<int, std::less<>>> u; 

還是不行:

User<FIFO<int>> u2; 

或者,也許我寫我自己的容器,它甚至不是一個班模板:

User<SpecialContainer> u3; 

你的作品無論如何。泛型很好。

+0

謝謝!我一直試圖弄清楚這一點,而我從來沒有想過這麼簡單。 – Mauricio

1

已經有一個可接受的答案,但我想展示所需的語法。

private: 
    // This line doesn't give an error. 
    List<GenType> mList; 
}; 

現在這行編譯過:

User<int, FIFO> u1; 

最後兩行不能編譯,因爲模板User只接受兩個參數。只需添加第三個參數。