我有点困惑为什么在好奇的重复模板模式(CRTP)设计模式上有如此多的"讨厌",例如我正在阅读"Game Programming Gems 3",并且有一个名为autoLists的设计.这使用CRTP创建每种类型对象的数组.
我的问题:
为什么这是一件坏事?特别针对AutoLists的想法,但一般来说CRTP的答案就足够了.
我的目的是在实体组件系统中使用它,这样我就可以轻松地分离每种类型的组件.
C++中的继承有两个不同的目的:
Mixins(向类添加新的,drop-in行为,不重复代码).
在这种情况下,基类没有自己的意义 - 它的目的是支持新行为,而不是在所有子类中用作公共基类.
多态性(扩展已在基类中声明的行为).
在这种情况下,基类为所有子类yada yada提供了一个通用接口.
CRTP通常用于第一个目的,并virtual用于第二个目的.
认识到两者之间的差异并不容易,需要一些练习.
有时,你可以用两者来实现同样的东西 - 区别仅在于"多态"是静态的(在编译时)还是动态的(在运行时).
如果你不需要运行时多态,那么你通常会使用CRTP,因为它通常更快,因为编译器可以看到编译时发生了什么.
也就是说,CRTP被广泛使用,我会犹豫不决地说它有"如此多的仇恨".
| 归档时间: |
|
| 查看次数: |
1381 次 |
| 最近记录: |