CRTP可以完全取代小型设计的虚拟功能吗?
Can CRTP completely replace virtual functionality for smaller designs?
CRTP是否能够完全超越virtual
的功能?
我认为CRTP的唯一缺点是为每个循环模式生成大量代码。对于较小的设计,(2-3个类来自一个基),CRTP是一个更好的主意吗?
CRTP不提供运行时多态性。如果需要运行时多态性,就需要虚方法。更糟糕的是,由于基类是模板化的,你甚至不能真正使用子类对象,就好像它们与基类具有相同的类型一样,因为你不能将它们强制转换为基类——它不存在;它只是一个模板。
我认为考虑多态替换CRTP更有用的方法不是作为虚拟继承的替代,而是作为混合的一种形式。你不是在制作通常意义上的子类;相反,你是在向你的类中添加预先制作好的功能。Mixin示例:一个Mixin的示例类似于依赖于。这样的mixin可以包含一个指向该项目所依赖的相同类型的其他项目的指针列表;它会添加一个方法register_dependency
,它会添加一个它所依赖的对象,而visit_dependents
会以(反向?)拓扑顺序访问它的所有依赖项。另一个例子可能是将compute_area
方法添加到本身包含width
和height
方法的任何内容。等等…
如果你认为它是类型层次结构的替代品,你只会让那些不能正常工作的代码更难理解,更难调试。除非您确实需要性能提升(如果有的话,但不能保证),否则这听起来不是个好主意。如果您这样做是为了快速地粘上一些额外的位,但没有继承的概念重量,我认为您很好-"真正的"继承无论如何都不需要那么频繁。
使用使设计更清晰,更易于编码/维护的方法。除非您有重要的性能/空间测量理由来选择其中之一,否则使用最简单的方法来编码/调试/维护几乎总是更好的。
使用CRTP,您必须有更多的模板方法,以便它可以作用于适当的基类,这可能是也可能不是一个缺点。
相关文章:
- 如何在C++中获得"静态纯虚拟"功能?
- std::is_trivially_copyable_v 关于虚拟功能
- 隐藏重载虚拟功能的模板化访客:SFINAE 在使用?
- 为什么我无法覆盖虚拟功能?
- 虚拟功能不起作用
- 如果在创建对象时创建了 VPTR,那么为什么具有虚拟功能的类的大小在 32 位系统上为 4,在 64 位机器上为 8
- 虚拟功能如何影响static_cast?
- __declspec(属性)和虚拟功能
- 实现来自第三方类的虚拟功能
- 消除未使用的虚拟功能
- 为什么虚拟继承即使不涉及虚拟功能也需要 vtable?
- C 虚拟功能的输出
- 抽象类 A 由类 C 继承"through"类 B "intermediary"。如何声明虚拟功能?
- 虚拟功能是否不太可能导致堆栈溢出
- 使用继承和虚拟功能应用五个规则
- 两个派生类(十六进制 二进制)的虚拟功能
- 虚拟功能编译器优化C
- 虚拟功能指针指向派生类中的函数
- 隐藏的过载虚拟功能OSX QT4
- 使用虚拟功能在C 中进行猜测