c++ - 使用编译时已知的类型避免模板冗长和动态多态性

标签 c++ templates inheritance c++11 polymorphism

在我的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.

有没有办法隐藏Grid2DImpulseRes 类型?只需要在 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/

相关文章:

c++ - 在 C++ 中下载一个 URL

javascript - DOM 可以差异化更新吗?

c++ - 可变参数模板中的分支

entity-framework - 急切加载多态子对象属性

java - 为什么我的泛型不采用子类?

C++/SDL 线程 - 事件分解

c++ - 在哪里放置 2 个文件的辅助函数?

c++ - C++11 : how to generate, 中的随机数生成是如何工作的?

c++ - 非类型模板参数和 std::enable_if_t

Java - 为什么另一个包中的子级无法通过父级引用访问父级的 protected 方法?