0

在我的碰撞/游戏物理引擎中,我允许用户创建/指定首选的空间分区方法和首选的分辨率方法。

这是一个空间分区的例子。

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.

有没有办法隐藏和类型?它们只需要在创建时知道。但也必须注意这些类型,因为它需要对空间分区方法实例和分辨率方法实例的引用。Grid2DImpulseResWorldBody

所需的代码示例:

World world1{new World<Grid2D, ImpulseRes>(...)};
Body& body1{world1.createBody()}; 

void useBody(Body& mBody) { ... }     
4

3 回答 3

1

我想你想要的是一个很好的老式typedef.

typedef basic_world<grid2d, impulse_res> world;
typedef basic_body<world> body;

world world1(...);
void useBody(body& bdy) { ... };
于 2013-08-22T14:39:52.403 回答
1

您可以使用

template <class TGrid, class TImpulse>
void useBody(Body<TGrid, TImpulse>& mBody) { ... } 

或者

template <class TBody>
void useBody(TBody& mBody) { ... } 
于 2013-08-22T14:50:05.527 回答
0

我不知道你的代码是如何分区的,但是如果你在实例化之后声明你的函数body1,也许你可以使用decltype

auto& body1 = world1.createBody();

using body_type = decltype(body1);

void useBody(body_type& b) { ... }
于 2013-08-22T14:38:47.347 回答