"Naming" 模板 class 实例化

"Naming" template class instantiations

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

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;

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

除了使用 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"; }
};

ECS 的全部意义在于毫无意义的动态。如果它不是毫无意义的动态,那么为什么首先要费心使用 ECS?只需使用常规 类 和组合即可。