2017-02-03 21 views
1

別のクラスで使用したいテンプレートクラスがあります。問題は、実際のタイプを知らなくてもテンプレートクラスを使いたいということです。C++の別のクラスのテンプレートクラスを使用

簡単な例:

template <class T> 
class Foo{ 
    private: 
     T x_; 
    public: 
     void Foo(T); 
}; 

さて、Fooを使用して、別のクラス。私は何をしたいのです:

class Bar{ 
    private: 
     Foo foo_; 

    public: 
     Bar(Foo); 
}; 

問題がBar内部で使用する場合Fooは、テンプレート引数を必要とすることです。 Barクラスが任意のテンプレート引数を使用してFooを処理するといいでしょう。回避策はありますか?

template <typename T> 
class Bar{ 
    private: 
     Foo<T> foo_; 

    public: 
     Bar(Foo<T>); 
}; 

はまた、あなたが共通多型インターフェイスの下Fooを型に消去することができます:

答えて

6

Bar自体クラステンプレートください。これにより、Fooの使用が制限され、実行時およびメモリオーバーヘッドが発生します。

struct FooBase { 
    virtual ~FooBase() { } 
    virtual void Xyz(int) { } 
}; 

template <class T> 
class Foo : FooBase { 
    private: 
     T x_; 
    public: 
     void Foo(T); 
     void Xyz(int) override 
     { 
      // `T` can be used in the definition, but 
      // cannot appear in the signature of `Xyz`. 
     } 
}; 

class Bar{ 
    private: 
     std::unique_ptr<FooBase> foo_; 

    public: 
     Bar(std::unique_ptr<FooBase>&&); 
}; 
+0

ありがとうございました。あなたの最初のソリューションは素敵でシンプルです!私はちょうど不思議に思っていました:クラスAがBによって使用されているクラスの階層構造をCなどで使用している場合、常にテンプレート引数を渡すのはやや面倒です。 – beginneR

+0

@beginneR:例を示すことはできますか?それはあまり面倒ではないかなり一般的なことです –

+0

私の 'Base'クラスは入力として' Foo'クラスのベクトルを取りますが、問題はベクトルの 'Foo'がすべて別の型を持っていて、 'Foo'のすべての型に対して1つの' Base'クラスが必要です。 – beginneR

関連する問題