CRTP的能力是否足以完全胜过virtual功能?
我看到CRTP的唯一缺点是为每个重复出现的模式生成大量的代码。对于较小的设计(其中2-3个类是从基础派生的),CRTP是更好的主意吗?
发布于 2011-07-08 00:23:15
CRTP不提供运行时多态性。如果你需要运行时多态性,你需要虚方法。更糟糕的是,由于基类是模板化的,您甚至不能真正使用子类对象,就好像它们与基类属于同一类型一样,因为您不能将它们强制转换为基类-它不存在;它只是一个模板。
我认为考虑多态性的一种更有用的方式--替换并不是作为虚拟继承的替代,而是作为一种mixins CRTP的形式的。您不是在制作通常意义上的子类;相反,您是在向您的类中添加预先创建的功能。
依赖mixin示例:是一个类似于-on的混合示例。这样的mixin可能包含指向该项目所依赖的相同类型的其他项目的指针列表;它将添加一个方法register_dependency,该方法添加一个它所依赖的对象,并添加一个visit_dependents,该方法访问它的所有依赖项(反向?)拓扑顺序。另一个例子可能是向任何本身包含width和height方法的对象添加compute_area方法。或者其他什么..。
如果你认为它是类型层次结构的替代品,你只会让你更难理解,更难调试那些不完全按照它应该工作的方式工作的代码。除非你真的需要性能提升(如果有的话--不能保证),这听起来是个坏主意。如果你这样做是为了快速粘合一些额外的部分,但又没有继承的概念权重,我会说你很好--“真正的”继承无论如何都不是必要的。
发布于 2011-07-08 00:22:59
使用任何能使设计更清晰且更易于编码/维护的工具。除非您有一个重要的性能/空间原因来选择其中之一,否则使用最简单的方法编码/调试/维护几乎总是更好。
对于CRTP,你必须有更多的模板方法,这样它才能作用于适当的基类,这可能是也可能不是缺点。
https://stackoverflow.com/questions/6613779
复制相似问题