我在将我编写的基于多态的物理引擎转换为基于模板的过程中遇到了很多麻烦。我之前做的是有一个SpatialBase抽象类(空间分区)和一个ResolverBase抽象类(接触求解器)。但是这两个类在编译时总是已知的,那么为什么不模板化引擎并移除虚拟调用开销呢?
那么问题来了:
template<class TS, class TR> class World;- 这是World<TS, TR>类,TS是空间分区类型,TR是接触求解器类型。
template<class TS, class TR> class Body;- 这是Body<TS, TR>课。它需要知道两者TS,TR因为它存储了一个World<TS, TR>&.
template<class TR> class Grid;- 这是Grid<TR>课。它需要知道TR,因为它需要知道什么Body<Grid, TR>是(它存储存储身体的细胞)。
template<class TS> class ImpulseSolver;- 这是ImpulseSolver<TS>。它需要知道TS,因为它需要知道是什么Body<TS, ImpulseSolver>(它直接处理身体的内部成员)。
现在...看到问题了吗?不可能宣布正确World<TS, TR>!
World< Grid<ImpulseSolver<Grid<ImpulseSolver..., ImpulseSolver<Grid<ImpulseSolver<Grid... > madWorld; // not by Gary Jules.
这是一个循环依赖。空间分区类需要知道接触求解器类,反之亦然,因为两者都需要知道类的确切类型Body<TS, TR>。
有没有办法解决这个问题?还是我注定要永远使用运行时多态性?