2011-01-20 10 views
2

ファクトリメソッドの設定の一種として、それぞれ異なるタイプのオブジェクトを作成しますが、共通のインタフェースを満たすファンクタを登録する必要があります。つまり、すべてコアクラスをサブクラス化するオブジェクトを作成します。各FactoryMethodテンプレートの特殊化は別のタイプであるので、私は(IIRC)std::map<std::string,FactoryMethod*>を持つことができません異なるテンプレートパラメータを持つテンプレートオブジェクトのコレクション

template <class T> struct FactoryMethod 
{ 
X* create(); 
} 

は、私のようなものを持っていると言います。しかし、私は行うことができます:

struct IFactoryMethod 
{ 
virtual X* create()=0; 
}; 
template <class T> struct FactoryMethod : public IFactoryMethod 
{ 
virtual X* create(); 
}; 
std::map<std::string,IFactoryMethod*> factories; 

右の? STLには、私がブーストしているとは思うが、これをもっと細かくする方法があることは分かっていない。しかし、今はブーストを使用せず、とにかく興味がある。

考え方はfactoriesで、正しいタイプを作成するためにタイプ名(XMLなどから読み取る)に基づいて検索できます。

答えて

1

これは型の消去と呼ばれ、かなり一般的なイディオムですが、あなたのマップはもちろん所有権を強制するポインタで作成することもできますし、ほとんどの普通の人のように仮想デストラクタを使うこともできます。

+0

それは擬似コードです、私に休憩を与えてください!あなたは "所有権を強制するポインタ"を明確にすることはできますか? –

+1

彼は基本的にあなたに生のポインタを使わないように伝えていますが、shared_ptr やunique_ptr を使うとポインタを安全に使うことができます。それらはboostから来て、std :: tr1またはstd in C++ 0xで見つけることもできます。あなたはここで見てみることができます:http://www.boost.org/doc/libs/1_38_0/doc/html/boost/interprocess/unique_ptr.html – MatiasFG

+1

pah、男性はポインタを恐れていない! –

関連する問題