“命名”模板类实例化

时间:2015-02-16 18:38:49

标签: c++ templates

在我的游戏引擎中,我创建了一个非常时髦的基于组件的实体系统,它允许我将实体类型定义为组件的组合,指定为模板参数,例如:

typedef Entity<Locateable, Collidable, Renderable /* etc */ > SomeEntity;

这很好,直到我需要唯一地标识模板定义的实例化。

typedef Entity<Locateable, Collidable, Renderable> Missile;
typedef Entity<Locateable, Collidable, Renderable> Bullet;

typeid(Missile) == typeid(Bullet) // sad panda :( 

显然他们是同一类型,但我希望他们不是,理想情况下我想给每个人一个字符串名称,如下所示:

// Invalid code...
typedef Entity<"Missile", Locateable, Collidable, Renderable> Missile;
typedef Entity<"Bullet", Locateable, Collidable, Renderable> Bullet;

这样我以后可以访问静态name()方法。但这不起作用,因为字符串需要静态实例化。我也尝试这样做,但也不允许lambdas ......

// More invalid code...
typedef Entity<[]()-> char* { return "Missile"; }, Locateable, Collidable, Renderable> Missile;
typedef Entity<[]()-> char* { return "Bullet"; }, Locateable, Collidable, Renderable> Bullet;

所以,我的问题是,是否有一些巧妙的技巧可以让我将模板定义命名为内联?

2 个答案:

答案 0 :(得分:4)

您可以使用简单的继承,而不仅仅是使用typedef,可能是这样的:

class Missile : public Entity<Locateable, Collidable, Renderable>
{
public:
    static std::string name() { return "Missile"; }
};

class Bullet: public Entity<Locateable, Collidable, Renderable>
{
public:
    static std::string name() { return "Bullet"; }
};

答案 1 :(得分:2)

ECS的重点是毫无意义。如果它没有毫无意义的动态,那么为什么首先要使用ECS呢?只需使用常规课程和作文。