c – 给定抽象基类X,如何创建另一个模板类D,其中T是从X派生的类
我希望能够接受消息&引用Message1或Message2类的对象.我希望能够创建一个MessageWithData< Message1>或MessageWithData< Message2>基于Message&的基础类型宾语.例如,见下文:
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开始) 解决方法
如前所述,无法按原样构建模板.
我没有看到传递其他参数的任何问题,尽管我可能将它们打包成单个结构,以便于操作. 当然,我发现使用补充数据参数更加惯用,而不是将类层次结构扩展到将所有这些都变成模式. 尝试使设计符合模式是一种反模式.正确的方法是调整模式,使其适合设计. 话虽如此… 您的解决方案有多种替代方案.继承似乎很奇怪,但没有手头的整个设计,它可能是你最好的选择. 已经提到过,你不能自由地混合编译时和运行时多态性.我通常使用Shims来规避问题: class Message {}; template <typename T> class MessageShim<T>: public Message {}; class Message1: public MessageShim<Message1> {}; 该计划很简单,让您从两全其美的优势中受益: >消息是非模板意味着您可以应用传统的OO策略 一旦完成,你应该能够得到你想要的,无论好坏. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |