在我的碰撞/游戏物理引擎中,我允许用户创建/指定首选的空间分区方法和首选的分辨率方法。
这是一个空间分区的例子。
struct SpatialBase
{
virtual void a() = 0;
virtual void b() = 0;
...
};
struct Grid2D : public SpatialBase { ... override a() and b() ... };
struct QuadTree : public SpatialBase { ... override a() and b() ... };
struct World
{
std::vector<std::unique_ptr<Body>> bodies;
std::unique_ptr<SpatialBase> spatial;
...
World(SpatialBase* mSpatial, ...) : spatial(mSpatial), ... { }
};
auto world1{new World{new Grid2D{...}, ...}};
auto world2{new World{new QuadTree{...}, ...}};
这工作正常,但动态多态性是完全没有必要的。事实上,模板化版本World
会过于冗长,因为还需要指定解析方法,并且Body
类必须意识到这一点。
例子:
auto world1{new World<Grid2D, ImpulseRes>(...)}; // fine
auto& body1{world1.createBody()}; // still fine
void useBody(auto& mBody) { ... }
// illegal! Wish I could use auto& here.
void useBody(Body<Grid2D, ImpulseRes>& mBody) { ... }
// legal - but verbose, and what if the user decides to change
// spatial partitioning or resolution? All code would break.
有没有办法隐藏和类型?它们只需要在创建时知道。但也必须注意这些类型,因为它需要对空间分区方法实例和分辨率方法实例的引用。Grid2D
ImpulseRes
World
Body
所需的代码示例:
World world1{new World<Grid2D, ImpulseRes>(...)};
Body& body1{world1.createBody()};
void useBody(Body& mBody) { ... }