加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 给定抽象基类X,如何创建另一个模板类D,其中T是从X派生的类

发布时间:2020-12-16 09:35:00 所属栏目:百科 来源:网络整理
导读:我希望能够接受消息引用Message1或Message2类的对象.我希望能够创建一个MessageWithData Message1或MessageWithData Message2基于Message的基础类型宾语.例如,见下文: class Message {};class Message1 : public Message {};class Message2 : public Messag
我希望能够接受消息&引用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>模板意味着您可以应用传统的通用编程策略

一旦完成,你应该能够得到你想要的,无论好坏.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读