按类型与字符串查找对象

Find Object By Type vs String

本文关键字:查找 对象 字符串 类型      更新时间:2023-10-16

我有一个抽象的组件类和一个实体类,其向量充满了组件(派生的可能性(。我希望能够查找组件。按类型查找它们更好还是按字符串查找更好?

ComponentA* component = entity.getComponent<ComponentA>();
// vs
ComponentA* component = entity.getComponent( "ComponentA" );

在这两种情况下,我都需要一个 vtable,但只有在后面,我才需要为每个派生类实现某种getName函数。

考虑以下声明:

template<typename T>
T * getComponent();

不同的T,不同的返回类型,您可以将返回值直接分配给正确类型的变量。
它可以工作。目前为止,一切都好。

现在考虑以下声明:

?? getComponent(std::string);

或者这个,如果你愿意:

?? getComponent (const char *);

返回类型应该是什么?您能做的最好的事情是使用组件的公共基类(如果存在(,并每次在调用方的上下文中强制转换它。我无法想象还有什么比这更烦人的了。
另一种你可以使用它的方式是返回一个void *但我不鼓励它。
您甚至可以添加第二个参数,该参数是可调用的对象,您将正确的类型传递给该对象(重载operator()或使其成为模板(,但它会使调用点的所有内容更加混乱。
否则,您可以将函数设置为模板,直接在调用点设置返回类型,但是...等。。。我们不是转向第一种情况吗?添加模板参数,删除函数参数,因为它现在是多余的,你得到的是:

template<typename T>
T * getComponent();

我想说,这已经足以决定什么是最好的选择。