CRTP能否完全取代较小设计的虚拟功能?

iam*_*ind 2 c++ virtual-functions crtp

CRTP是否足以virtual完全超越功能?

我看到CRTP的唯一缺点是为每个重复模式生成了大量的代码.对于较小的设计(其中2-3个类来自基础),CRTP是更好的主意吗?

Eam*_*nne 15

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

我认为一种更有用的思考多态性的方法 - 替换CRTP不是取代虚拟继承,而是作为一种混合形式.你不是通常意义上的子类; 相反,您正在为您的班级添加预制功能.

Mixin示例: mixin的一个例子就像依赖.这样的mixin可能包含一个指向该项依赖的相同类型的其他项的指针列表; 它会添加一个方法register_dependency来添加它依赖的对象,并visit_dependents以(反向?)拓扑顺序访问它的所有依赖项.另一个例子可能是compute_area为自己包含的任何东西widthheight方法添加方法.管他呢...

如果您认为它是类型层次结构的替代品,那么您只需要更难理解,更难以调试不完全按预期工作的代码.除非你真的需要性能提升(如果有的话 - 不能保证),这听起来不错.如果你这样做是为了快速粘合一些额外的位但没有继承的概念性重量,我会说你很好 - 无论如何经常不需要"真正的"继承.