在我的collision/game physics engine , 我允许用户创建/指定首选空间分区方法和首选分辨率方法。
这是一个空间分区的例子。
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) { ... }
最佳答案
我想你想要的是一个很好的老式 typedef
。
typedef basic_world<grid2d, impulse_res> world;
typedef basic_body<world> body;
world world1(...);
void useBody(body& bdy) { ... };
关于c++ - 使用编译时已知的类型避免模板冗长和动态多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18383365/