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策略
> MessageShim< T>模板意味着您可以应用传统的通用编程策略
一旦完成,你应该能够得到你想要的,无论好坏.
标签:c,templates,inheritance,double-dispatch 来源: https://codeday.me/bug/20190730/1578285.html