2011-01-24 21 views
0

私は現在、一般的な抽象工場を設計し、以下のクラスのデザインは、スケッチ持ってしようとしています:C++一般的な抽象ファクトリーデザイン質問

template <typename T> 
class TFactory 
{ 
    public: 
     template <typename A> 
     static T* create(A a); 

     template <typename A, typename B> 
     static T* create(A a, B b); 

     template <typename A, typename B, typename C> 
     static T* create(A a, B b, C c); 

     static T* destory(T* ptr); 
}; 

を工場出荷時には、次にように使用することができます。

Factory<MyType>::create(1, "hello"); 
Factory<MyType>::create<short, const std::string&>(1, "hello"); 

これを設計するより良い方法はありますか?これはvarargsより優れているようですが、それでも私は最大10個の関数をオーバーロードしています。

EDIT:

私はこの理由を追加する必要がありますが、私は工場内のカスタムメモリアロケータを使用することです。

答えて

1

このような作業は、BindやLambdaなどのBoostライブラリですでに実行されています。

Hereは、コンストラクタ/デストラクタとnew/deleteをラップするラムダ式のリストです。あなたはそれらを使うことも、あなた自身のことを書くためにインスピレーションを得ることもできます。例えば

は、ラムダのコンストラクタを使用して、あなたは以下を持つことができます:

template <typename T> class TFactory { 
    public: 
     template <typename A> 
     static T* create(A a) { 
      return new a(); //where a wraps a binded constructor call. 
     }; 
}; 

次のように続いて、作成した機能を使用します。

Factory<MyType>::create(boost::bind(boost::lambda::constructor<MyType>(),1,"hello")); 

私はあなたの方法を見つけることができると確信していこれをもっと良く見えるようにする(多分#defineを付けて)。

1

バリデーショナルテンプレートがなければ、あまりできません(プリプロセッサの乱用を除きますが、コードジェネレータを使用しないでこのことをきちんとやる方法はありません)。

ホイールを改造したくない場合は、boost::make_sharedをご覧ください。

ところで、これは抽象的な工場ではありません。抽象ファクトリは多相クラスです。

1

あなたが探しているようなサウンドはVarardic Templatesです。これはC++ 0x標準の一部として導入されます。

関連する問題