我正在尝试构建entity system。每个实体都有一组与之关联的组件,每个组件都是唯一类型。所有组件都派生自基本组件类。
我需要创建一个add / remove / get Component类,它以某种方式将组件类型作为变量(即使用模板)。每次使用例如调用组件类型时检查组件类型。 typeid
效率不高所以我需要为每个派生的组件类生成一个标识符。在这里的其他帖子中,我已经看到过这种方式有多种,包括使用CRTP和使用一些模板函数,每次定义派生类时都需要调用它。
我对这些方法的问题(主要是个人的)是你必须至少添加某种评论来通知谁可能有兴趣创建一个他应该使用上述方法之一的新Component类,即,要求在代码本身中没有明确可见。
因此,我正在寻找一种方法,以某种方式干净地处理保存RTTI而不对想要潜在使用实体系统的人强制执行任何特殊规则。
作为一个例子,我最好的做法就是在addComponent
函数中进行类型检查。这是使用模板函数完成的,该函数计算唯一类并返回该类的id,即
extern int component_id_count;
int component_id_count = 0;
template <class T>
int getComponentID(void){
static int id = component_id_count++;
return id;
}
然后检查id是否大于上次遇到的id。如果是,则遇到新的组件类型,并且需要注册。如果多次调用addComponent
,这可能非常有效。但我仍然不得不怀疑是否有更有效的方法来实现我想要达到的目标。