私はいくつかのメッセージ処理コードを書いています。これにより、各メッセージは 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
を使用して抽象基本クラスを生成すると、どのような影響がありますか?