2016-09-24 4 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; 
}; 

そして今、私はQueueまたはFIFO(または他のタイプのいずれかを使用することができますクラスを持っている:

は、私は次のように定義されているキューの2種類を、持っていると仮定しますそれは立っ

// 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

このようにしないでください。この道を

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クラステンプレートは、使用する予定のコンテナのフルタイプを取り、コンテナはそれが取る値のタイプを示してみましょうしましょうあなたのクラステンプレートのユーザーは、適切なものを提供することができます。私はあなたのプライオリティキューを使用したい場合は、私は、コンパレータに渡すことができます私が直接欲しい:

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は、2つのパラメータのみを受け付けますので、最後の2行をコンパイルすることはできません。 3番目のパラメータを追加するだけです。

関連する問題