C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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 – 给定抽象基类X,如何创建另一个模板类D,其中T是从X派生的类的类型?全部内容,希望文章能够帮你解决c – 给定抽象基类X,如何创建另一个模板类D,其中T是从X派生的类的类型?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: