"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?只需使用常规 类 和组合即可。
在我的游戏引擎中,我创建了一个非常时髦的基于组件的实体系统,它允许我将实体类型定义为组件的组合,指定为模板参数,例如:
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?只需使用常规 类 和组合即可。