c ++实体组件系统和使用模板访问组件

时间:2015-07-04 06:06:21

标签: c++ c++11 templates components entity-component-system

我一直致力于创建自己的实体组件系统,并且我已经开始通过执行以下操作来获取组件:

const auto& component = entity->GetComponent<ComponentType>();

上面的函数看起来像这样:

template <typename TyComponent>
TyComponent* Entity<T>::GetComponent() const
{
  return &(GetComponent(TyComponent::Id());
}

然后,如果找到,则返回基于关联ID的组件,否则为nullptr

  1. 我做的是否可行?
  2. 有没有办法确保只有从Component派生的类型才可以 用作GetComponent
  3. 的参数

1 个答案:

答案 0 :(得分:2)

这个设计还可以。

如果有人尝试<% --- your code--- %> ,您已经收到编译时错误,但GetComponent<Foo>没有静态Foo功能。这样可以给你一点安全感。

但是,它仍然需要一个更改才能编译。以下是我的表现:

Id()

Component * GetComponent(int id) { ... } template <typename TyComponent> TyComponent* Entity<T>::GetComponent() const { return dynamic_cast<TyComponent*>(GetComponent(TyComponent::Id())); } 未派生自TyComponent时,现在会生成编译错误。 (组件至少需要一个虚函数才能工作。)