【发布时间】:2011-05-26 22:49:07
【问题描述】:
我希望能够接受引用 Message1 或 Message2 类的 Message& 对象。我希望能够基于Message& 对象的基础类型创建MessageWithData<Message1> 或MessageWithData<Message2>。例如,见下文:
class Message {};
class Message1 : public Message {};
class Message2 : public Message {};
template<typename Message1or2>
class MessageWithData : public Message1or2 { public: int x, y; }
class Handler()
{
public:
void process(const Message& message, int x, int y)
{
// create object messageWithData whose type is
// either a MessageWithData<Message1> or a MessageWithData<Message2>
// based on message's type.. how do I do this?
//
messageWithData.dispatch(...)
}
};
messageWithData 类本质上包含从 Message 继承的方法,这些方法允许根据其类型动态地将其双重分派回处理程序。到目前为止,我最好的解决方案是将数据与消息类型分开,并一直通过动态调度链传递,但我希望更接近动态双重调度的真正习惯,其中消息类型包含可变数据。
(我或多或少遵循的方法来自http://jogear.net/dynamic-double-dispatch-and-templates)
【问题讨论】:
-
Message1 和 Message2 都是从 Message 派生的,因此使用模板而不是虚拟调度函数有什么优势?
-
抱歉,在我发布的缩写代码中并不明显——
Message1实际上继承自Message<Message1>,而Message<Message1>继承自MessageBase。MessageBase有一个纯虚dispatch()方法,Message<Message1>实现了该方法。在Message<Message1>::dispatch()中,完成了static_cast<const Message1*>(this)以便分派回处理程序中的正确函数。因此MessageWithData也必须使用Message1或Message2进行模板化,这样dispatch() 才能正常工作。
标签: c++ templates inheritance double-dispatch