【发布时间】:2012-11-13 09:54:53
【问题描述】:
我正在编写一些消息处理代码,其中每条消息都是一个 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 生成抽象基类有什么含义?
【问题讨论】: