C++ 按类型与字符串查找对象

C++ 按类型与字符串查找对象,c++,components,game-engine,C++,Components,Game Engine,我有一个抽象的组件类和一个实体类,其中有一个充满组件的向量(派生的可能性)。我希望能够查找组件。按类型还是按字符串查找更好 ComponentA* component = entity.getComponent<ComponentA>(); // vs ComponentA* component = entity.getComponent( "ComponentA" ); ComponentA*component=entity.getComponent(); //vs Compon

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

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

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

考虑以下声明:

template<typename T>
T * getComponent();
?? getComponent(std::string);
如果您愿意,也可以选择这个:

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

template<typename T>
T * getComponent();
模板
T*getComponent();

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

您有
模板的类型安全性,您如何从字符串中知道(结果)类型?