首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用模板创建类型安全的C++“组件管理器”

使用模板创建类型安全的C++“组件管理器”
EN

Stack Overflow用户
提问于 2012-05-15 00:47:52
回答 1查看 638关注 0票数 0

我正在尝试在C++中创建一个类似于Unity3d中的“组件管理器”类。我想要的是一个容器类,它可以容纳某些类的派生类型,比如BaseComponent。在unity中,可以使用泛型以类型安全的方式请求组件,方法是通过

哪个返回类型是DerivedComponentType&的manager.GetComponent()

我想在C++中使用相同的界面。这样,只要通过AddComponent函数添加组件,就可以从使用的角度保证整个过程是类型安全的。

在这里,我试图避免使用字符串标识之类的事情。我意识到我也可以通过为每个派生类型提供一个同名的静态成员函数来实现这一点,并使用该成员函数的地址作为类实例的映射索引。我宁愿不这样做,这样组件管理器的用户就不必确保这个函数存在,如果他们选择派生自己的组件的话。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-17 02:42:36

其中一种方法是使用dynamic_cast。

代码语言:javascript
运行
AI代码解释
复制
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将给出一个空指针。当然,这是在运行时必须完成的事情。在现代机器上,这不会是一个巨大的成功,除非你经常这样做。还有一些其他的方法会涉及更多。

您还可以考虑编写一个反射系统,它提供了一种更快地查找类型信息的方法,这样您就可以拥有如下内容:

代码语言:javascript
运行
AI代码解释
复制
Derived* GetComponent (MetaData *TypeIWant)
{
  if (componentlist[i]->Type() == TypeIWant)
  //...
}

从长远来看,这将是更多的工作,并且需要您做一些研究,但这可能是我所知的唯一不需要使用字符串查找和许多人讨厌的“可怕的”dynamic_cast的c++选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10592849

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文