8

私はいくつかのメッセージ処理コードを書いています。これにより、各メッセージは POD 構造になります。これを書く途中で、各メッセージタイプの仮想機能を持つ抽象基本クラスを定義することになります。

class AbstractHandler
{
public:
    virtual void handleMessage( const MessageType1& msg ) =0;
    virtual void handleMessage( const MessageType2& msg ) =0;
    virtual void handleMessage( const MessageType3& msg ) =0;
    virtual void handleMessage( const MessageType4& msg ) =0;
};

次に、ハンドラー関数を実装する派生具象クラスを作成します。

class ConcreteHandler : public AbstractHandler
{
public:
    virtual void handleMessage( const MessageType1& msg );
    virtual void handleMessage( const MessageType2& msg );
    virtual void handleMessage( const MessageType3& msg );
    virtual void handleMessage( const MessageType4& msg );
};

新しいメッセージがシステムに追加された場合はAbstractHandler、すべての派生型とともに更新する必要があります。

または、サポートされているすべてのメッセージ タイプをmplシーケンスに保持し、それを使用mpl::inherit_linearlyして抽象基本クラスを生成することもできます。

(注:mpl::vectorコードの別の場所でメッセージ タイプの を既に使用しています。)

例えば:

typedef mpl::vector< MessageType1, MessageType2, 
                     MessageType3, MessageType4 > message_types;

template< class Message >
class Wrapper
{
public:
   virtual void handleMessage( const Message& msg ) = 0;
protected:
   ~Wrapper(){}
};

class AbstractHandler 
     : public mpl::inherit_linearly< message_types
                                   , mpl::inherit< mpl_1, Wrapper< mpl::_2 > >
                                   >::type
{
public:
    virtual ~AbstractHandler() {}
};

次に、具体的なハンドラーが から派生しAbstractHandlerます。つまり、新しいメッセージ タイプがシステムに追加されるたびに、mpl::vector< types... > message_typesシーケンスが変更され、新しいhandleMessage関数が派生クラスに追加されるだけです。

私の意見では、AbstractHandler は、mpl::vector message_types

パフォーマンスに関して、このアプローチを使用することの欠点はありますか?

mpl::inherit_linearlyを使用して抽象基本クラスを生成すると、どのような影響がありますか?

4

1 に答える 1

3

以前にも同様のコードを実行したことがあります (そして今日も実行しています)。

継承に伴うコスト以外のコストはありません。主な理由は、最終的な型が実行時ではなくコンパイル時に決定されるためです。

ただし、これにより、メッセージ型リストのサイズに比べて、コンパイル時間が明らかに長くなる可能性があります。私のように、メッセージ ディスパッチャー クラス (この型の任意のハンドラーに任意のディスパッチを行うことができるクラス) も作成すると、コンパイル時間が長くなる可能性があります。

そうでなければ、それは良いことです。

この種のセットアップの意味を理解してください。処理されるメッセージのリストは、実行時ではなくコンパイル時に定義されます。一部のイベント システムは、使用要件のためにランタイムです。したがって、ユースケースで必要なものであることを確認してください。

于 2012-11-21T16:56:22.853 に答える