CRTP可以完全取代小型设计的虚拟功能吗?

Can CRTP completely replace virtual functionality for smaller designs?

本文关键字:虚拟 功能 小型 取代 CRTP      更新时间:2023-10-16

CRTP是否能够完全超越virtual的功能?

我认为CRTP的唯一缺点是为每个循环模式生成大量代码。对于较小的设计,(2-3个类来自一个基),CRTP是一个更好的主意吗?

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

我认为考虑多态替换CRTP更有用的方法不是作为虚拟继承的替代,而是作为混合的一种形式。你不是在制作通常意义上的子类;相反,你是在向你的类中添加预先制作好的功能。

Mixin示例:一个Mixin的示例类似于依赖于。这样的mixin可以包含一个指向该项目所依赖的相同类型的其他项目的指针列表;它会添加一个方法register_dependency,它会添加一个它所依赖的对象,而visit_dependents会以(反向?)拓扑顺序访问它的所有依赖项。另一个例子可能是将compute_area方法添加到本身包含widthheight方法的任何内容。等等…

如果你认为它是类型层次结构的替代品,你只会让那些不能正常工作的代码更难理解,更难调试。除非您确实需要性能提升(如果有的话,但不能保证),否则这听起来不是个好主意。如果您这样做是为了快速地粘上一些额外的位,但没有继承的概念重量,我认为您很好-"真正的"继承无论如何都不需要那么频繁。

使用使设计更清晰,更易于编码/维护的方法。除非您有重要的性能/空间测量理由来选择其中之一,否则使用最简单的方法来编码/调试/维护几乎总是更好的。

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