2

我一直在努力创建自己的实体组件系统,并且我准备通过执行以下操作来获取组件:

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

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

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

如果找到,则返回基于关联 id 的组件,否则返回nullptr

  1. 我正在做的事情可行吗?
  2. 有没有办法确保只有从 Component 派生的类型才能用作参数GetComponent
4

1 回答 1

2

这个设计还行。

如果有人尝试,您将已经收到编译时错误GetComponent<Foo>,但Foo没有静态Id()函数。所以这会给你一点安全感。

但是,它仍然需要进行一次更改才能编译。这是我的做法:

Component * GetComponent(int id) { ... }

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

如果TyComponent不是从Component. (不过,组件至少需要一个虚拟功能才能工作。)

于 2015-07-04T07:02:07.670 回答