【问题标题】:Implications of using mpl::inherit_linearly for defining interfaces使用 mpl::inherit_linearly 定义接口的含义
【发布时间】: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&lt; types... &gt; message_types 序列,将新的handleMessage 函数添加到派生类。

在我看来,这减少了长期维护,因为 AbstractHandler 将自动为mpl::vector message_types 中的所有消息提供纯虚函数

在性能方面,使用这种方法有什么缺点吗?

使用mpl::inherit_linearly 生成抽象基类有什么含义?

【问题讨论】:

    标签: c++ boost boost-mpl


    【解决方案1】:

    我以前做过类似的代码(今天又做了一次)。

    除了继承引起的成本外,没有其他成本。主要是因为最终类型是在编译时确定的,而不是运行时。

    但是,相对于消息类型列表的大小,这显然会使您的编译时间更长。 如果你也像我一样编写消息调度程序类(它可以将任何东西调度到这种类型的任何处理程序),那么编译时间可能会很昂贵。

    要不然就好了。

    只需理解这种设置的含义:处理的消息列表是在编译时定义的,而不是在运行时定义的。由于使用要求,一些事件系统是运行时的。因此,请确保它是您在用例中想要的。

    【讨论】:

    • 感谢您确认我对此的看法。我现在有一个有效的解决方案,它是客户端服务在处理消息时使用的 API 的一部分。到目前为止,所有用户都喜欢 API……MPL 无疑有助于生成健壮的代码……
    • 在用户方面它有一些缺点:必须定义哪些功能不太明显。一个好的(最近的)编译器会发出明确的信息,所以我想没关系。如果有一种方法可以强制用户显式地重写函数(以确保他们不会出错),那就更好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多