按类型查找对象vs字符串

问题描述:

我有一个抽象组件类和一个向量充满组件(派生可能性)的实体类。我希望能够查找组件。按照类型或字符串查找它们会更好吗?按类型查找对象vs字符串

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

在这两种情况下,我需要一个虚函数表,但只有在以后我会需要实现某种功能getName为每派生类。

+0

你有'template'类型安全,你怎么知道字符串(结果)类型? – Jarod42

考虑这样的声明:

template<typename T> 
T * getComponent(); 

不同T S,不同的返回类型,您可以直接将返回的值向右类型的变量。
它可以工作。到现在为止还挺好。如果你喜欢

?? getComponent(std::string); 

或者这一个:

?? getComponent (const char *); 

应该是什么返回类型

现在考虑这个声明?你可以做的最好的做法是使用组件的公共基类(如果存在的话),并且每次都在调用者的上下文中进行转换。我无法想象其他事情更令人讨厌。
另一种方式可以使用它是通过返回一个void *但我劝阻它。
您甚至可以添加第二个参数,该参数是您传递正确类型(超载operator()或使其成为模板)的可调用对象,但它会使调用点处的所有内容更加混乱。
否则,你可以让你的函数成为一个模板,直接在返回类型上设置返回类型,但是......等等......我们不是转向第一种情况吗?添加模板参数,删除功能参数为它的现在多余的,你得到的是:

template<typename T> 
T * getComponent(); 

我会说,这已经足够了决定什么是最好的选择。