2012-02-17 4 views
1

私は、プログラムの実行を制御する単一のマネージャを持つ従来のソフトウェアを持っています。プログラムの実行中にさまざまなコールバッククラスのメソッドを呼び出します。これらはユーザーフックです。問題は、これら1000個の異なるフックのことです。 1)それぞれ明らかに異なるインターフェースを持っています。 2)実行マネージャーにはそれぞれのスロットが1つしかありません。コンポーネントのリストにコールバックを渡すためのラッパーC++

私は、ユーザーが実行マネージャーを使って各ユーザーフックインクラスのインスタンスを1つだけ登録できるようにしても、私のグループのスパゲッティコードが多くなることに気付きました。私はフックのリストを含む単純なラッパーを記述し、リストをループして各インスタンスのコールバックを呼びたいと思います。例:

class SomeLegacyUserActionClass 
{ 
public: 
    virtual void A(); 
    virtual void B(); 
}; 

class MyWrapper : public SomeLegacyUserActionClass 
{ 
    std::vector< SomeLegacyUserActionClass* > actionList; 
public: 
    void A() 
    { 
     // loop over each action in actionList 
     { 
      action->A(); 
     } 
    } 

    void B() 
    { 
     // loop over each action in actionList 
     { 
      action->B(); 
     } 
    } 

    void addAction(SomeLegacyUserActionClass* action) { ... } 
}; 

これは、とても多くのクラスでは非常に面倒で醜いものになっています。テンプレートクラスを作る方法や、これを行う方法がありますか?明らかにここにパターンがありますが、私は何とかC++でそれを活用できるかどうか分かりません。

私のグループには、すべての行動に対してデコレータパターンを実装して、ベクトルとループを取り除くことができたと思います。

おかげ

答えて

0

テンプレートで使用するタイプのメンバー関数の一覧を取得する方法がないので、これは、テンプレートでは不可能です。実際にクラスがたくさんある場合は、古典的なコード生成を使用することは賢明かもしれません。