我正在尝试在C++中创建一个类似于Unity3d中的“组件管理器”类。我想要的是一个容器类,它可以容纳某些类的派生类型,比如BaseComponent。在unity中,可以使用泛型以类型安全的方式请求组件,方法是通过
哪个返回类型是DerivedComponentType&的manager.GetComponent()
我想在C++中使用相同的界面。这样,只要通过AddComponent函数添加组件,就可以从使用的角度保证整个过程是类型安全的。
在这里,我试图避免使用字符串标识之类的事情。我意识到我也可以通过为每个派生类型提供一个同名的静态成员函数来实现这一点,并使用该成员函数的地址作为类实例的映射索引。我宁愿不这样做,这样组件管理器的用户就不必确保这个函数存在,如果他们选择派生自己的组件的话。
谢谢。
发布于 2012-05-17 02:42:36
其中一种方法是使用dynamic_cast。
template <typename Derived>
Derived* GetComponent (void)
{
// componentlist is a std::vector<BaseClass*>
for (unsigned i = 0; i < componentlist.size(); ++i)
{
Derived* val = dynamic_cast<Derived*>(componentlist[i]);
if (val != 0)
return val;
}
return 0;
}
如果类型与模板给出的值不匹配,dynamic_cast将给出一个空指针。当然,这是在运行时必须完成的事情。在现代机器上,这不会是一个巨大的成功,除非你经常这样做。还有一些其他的方法会涉及更多。
您还可以考虑编写一个反射系统,它提供了一种更快地查找类型信息的方法,这样您就可以拥有如下内容:
Derived* GetComponent (MetaData *TypeIWant)
{
if (componentlist[i]->Type() == TypeIWant)
//...
}
从长远来看,这将是更多的工作,并且需要您做一些研究,但这可能是我所知的唯一不需要使用字符串查找和许多人讨厌的“可怕的”dynamic_cast的c++选择。
https://stackoverflow.com/questions/10592849
复制相似问题