2011-12-20 3 views
3

クラスをテンプレートにしなくても、テンプレートまたは自動変数をクラスに格納する方法はありますか?私は、STL乱数ジェネレータの1つにポインタを格納しようとしていますが、クラス全体をテンプレートにすることなく、それを行う方法がわかりません。これはオプションではありません。なぜなら、cpp内のすべてのものをhファイルに移動すると、処理したくない循環ヘッダファイルがたくさんあるからです。非テンプレートクラスの任意の型のC++メンバ変数

class tSomeClass 
{ 
    public: 
     template<typename RNG> 
     tSomeClass(RNG * rng) : fRNG(rng) { } 

    private: 
     RNG * fRNG; // How do I get this working??? 
}; 

私はいつも、私は困惑してテンプレートとして、クラス全体を持つことが必要で終わりを作ってみたこれまでのすべて:だから、例えばそれは、このようなものになるだろう。

編集:私は何か言及するのを忘れていた。 STLが使用しているRNGの基底クラスを知っていなければ、基底が何であるかわからないので、継承を使用してRNG型を指定することはできません。現在、私はstd :: default_random_engineを使用しています。

+0

なぜこのためのテンプレートが必要ですか?定期的な継承はできないでしょうか? – dasblinkenlight

+0

¤単純に 'std :: function < double() >'を保存することができます。乾杯。 –

+0

* ANY *タイプをRNGに保存してもよろしいですか?何とかそれを制限することはできませんか?つまり、クラスへのポインタ、プリミティブ型へのポインタなどを格納したいのですか? – Lucian

答えて

5

私はあなたが本当にテンプレートをしたくない場合は二つの選択肢を考えることができます。

  • あなたは文字通りあらゆるタイプを意味している場合、あなたはvoid *を使用することができます。これは非常に型の安全ではなく、クラスのユーザーは実際にそれを使って何をするのかを正確に知る必要があります。
  • タイプを基本インターフェース/クラスに制約できる場合は、代わりにそのタイプへのポインタを使用できます。 IRandom *。これは一般的にもっと有用で/有用であるようです。
0

安全かつ正確な方法は、インターフェイスを記述するクラスを定義し、実際の実装で継承することです。

例:

class RNG { 
    public: 
     virtual int get(void) = 0; 
} 
0

Cの方法は、これはC++は単に継承と動的バインディング、すなわちを活用であるがため、一般的なポインタ(void*)を使用することである。

class RNG /* random number generator interface/base class */ 
{ 
    public: 
     virtual int randomize(void) = 0; 
}; 

class RandomA : public RNG /* one implementation of a random num generator */ 
{ 
    public: 
     int randomize() { return 4; } 
}; 

class RandomB : public RNG /* another implementation of a random num generator */ 
{ 
    public: 
     int randomize() { return 0; } 
}; 

class tSomeClass 
{ 
    public: 
     tSomeClass(RNG * rng) : fRNG(rng) { } 

    private: 
     RNG * fRNG; 
}; 

... 

RandomA randomObj; 
tSomeClass t(&randomObj); 

またはそれがあなたの乱数ジェネレータすべてで構成されている場合、関数ポインタでさえも行います。

+0

これは、すべてのRNGの基本クラスが何であるかを知っていればうまくいくが、現在はない。質問を詳細に更新しました。 – Shenjoku