【问题标题】:Can CRTP completely replace virtual functionality for smaller designs?CRTP 能否完全替代小型设计的虚拟功能?
【发布时间】:2011-07-07 16:18:11
【问题描述】:

CRTP 的能力是否足以完全胜过virtual 的功能?

我看到的 CRTP 的唯一缺点是每个重复出现的模式都会生成大量代码。对于较小的设计(其中 2-3 个类从基类派生),CRTP 是更好的主意吗?

【问题讨论】:

    标签: c++ virtual-functions crtp


    【解决方案1】:

    CRTP 不提供运行时多态性。如果您需要运行时多态性,则需要虚拟方法。更糟糕的是,由于基类是模板化的,您甚至不能真正使用子类对象,就好像它们与基类属于同一类型一样,因为您不能将它们强制转换为该基类——它不存在;它只是一个模板。

    我认为考虑多态性替代 CRTP 的一种更有用的方法不是替代虚拟继承,而是作为一种混合形式。您没有在通常意义上创建子类;相反,您正在为您的课程添加预制功能。

    混合示例:混合的示例类似于依赖。这样的 mixin 可能包含指向该项目所依赖的相同类型的其他项目的指针列表;它会添加一个方法register_dependency,添加一个它依赖的对象和visit_dependents,它以(反向?)拓扑顺序访问它的所有依赖项。另一个示例可能是将compute_area 方法添加到本身包含widthheight 方法的任何东西。或者随便什么...

    如果您将其视为类型层次结构的替代品,那么您只会更难理解、更难调试不能按应有方式工作的代码。除非你真的需要性能提升(如果有的话——不能保证),这听起来是个坏主意。如果你这样做是为了快速粘上一些额外的部分,但没有继承的概念权重,我会说你很好——无论如何,“真正的”继承并不是那么频繁。

    【讨论】:

    • you're adding premade functionality to your class,你能详细说明一下吗?
    【解决方案2】:

    使用使设计更清晰且更易于编码/维护的任何一种。除非您有明显的性能/空间理由来选择其中一个,否则几乎总是最好使用最简单的方法来编码/调试/维护。

    使用 CRTP,您必须拥有更多模板方法,以便它可以作用于正确的基类,这可能是也可能不是缺点。

    【讨论】:

    • CRTP 不是更简单的选择吗,因为它是模板化的并且不易出错?
    猜你喜欢
    • 2015-01-04
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    相关资源
    最近更新 更多