1

我正在尝试建立一个实体系统。每个实体都有一组与之关联的组件,并且每个组件都是唯一的类型。所有组件都派生自一个基组件类。

我需要创建一个添加/删除/获取组件的类,它以某种方式(即使用模板)将组件类型作为变量。每次使用 eg 调用这些组件时检查组件类型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如果不被多次调用,这可能非常有效。但我仍然想知道是否有更有效的方法来实现我想要实现的目标。

4

0 回答 0