我有一个抽象的组件类和一个带有一个充满组件的向量的实体类(派生的可能性)。我希望能够查找组件。按类型或字符串查找它们会更好吗?
ComponentA* component = entity.getComponent<ComponentA>();
// vs
ComponentA* component = entity.getComponent( "ComponentA" );
在这两个实例中,我都需要一个vtable,但只有在后面我需要为每个派生类实现某种getName
函数。
答案 0 :(得分:1)
考虑这个声明:
template<typename T>
T * getComponent();
不同的T
s,不同的返回类型,您可以将返回的值直接分配给正确类型的变量。
它可以工作。到目前为止一切都很好。
现在考虑一下这个声明:
?? getComponent(std::string);
如果你愿意,可以选择这个:
?? getComponent (const char *);
返回类型应该是什么?您可以做的最好的事情是使用组件的公共基类(如果存在)并且每次都在调用者的上下文中将其强制转换。我无法想象实际上有什么更令人烦恼的事
你可以使用它的另一种方法是返回void *
,但我不鼓励它
您甚至可以添加第二个参数,该参数是您向其传递正确类型的可调用对象(重载operator()
或使其成为模板),但它会使调用点处的所有内容更加混乱。
否则,您可以将您的功能设为模板,直接在呼叫点设置返回类型,但是......等等......我们是否转向第一种情况?添加模板参数,删除函数参数,它现在是多余的,你得到的是:
template<typename T>
T * getComponent();
我说这已经足以决定什么是最好的选择。