CRTP是否有能力virtual
完全超越功能?
我看到的 CRTP 的唯一缺点是为每个重复模式生成的大量代码。对于较小的设计(其中 2-3 个类派生自一个基类),CRTP 是一个更好的主意吗?
CRTP是否有能力virtual
完全超越功能?
我看到的 CRTP 的唯一缺点是为每个重复模式生成的大量代码。对于较小的设计(其中 2-3 个类派生自一个基类),CRTP 是一个更好的主意吗?
CRTP 不提供运行时多态性。如果您需要运行时多态,则需要虚拟方法。更糟糕的是,由于基类是模板化的,您甚至不能真正使用子类对象,就好像它们与基类属于同一类型一样,因为您不能将它们强制转换为该基类——它不存在;它只是一个模板。
我认为考虑多态性替换 CRTP 的一种更有用的方法不是替代虚拟继承,而是作为mixins 的一种形式。您没有在通常意义上创建子类;相反,您正在为您的课程添加预制功能。
Mixin 示例: mixin 的示例类似于depends-on。这样的 mixin 可能包含指向该项目所依赖的相同类型的其他项目的指针列表;它会添加一个方法register_dependency
,该方法添加它所依赖的对象,并visit_dependents
以(反向?)拓扑顺序访问其所有依赖项。另一个例子可能是将compute_area
方法添加到本身包含的任何东西width
和height
方法的东西。管他呢...
如果您将其视为类型层次结构的替代品,那么您只会变得更难理解,更难调试不能完全按照应有方式工作的代码。除非你真的需要性能提升(如果有的话——不能保证),这听起来是个坏主意。如果你这样做是为了快速粘上一些额外的位,但没有继承的概念权重,我会说你很好——无论如何,“真正的”继承并不需要那么频繁。
使用使设计更清晰且更易于编码/维护的任何一种。除非您有明显的性能/空间理由来选择其中一个,否则使用最简单的编码/调试/维护方法几乎总是更好。
使用 CRTP,您必须拥有更多模板方法,以便它可以作用于正确的基类,这可能是也可能不是缺点。