其他分享
首页 > 其他分享> > c – 给定抽象基类X,如何创建另一个模板类D,其中T是从X派生的类的类型?

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