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

C++ c++;实体组件系统和使用模板访问组件,c++,c++11,templates,components,entity-component-system,C++,C++11,Templates,Components,Entity Component System,我一直在努力创建我自己的实体组件系统,我开始通过以下操作获得组件: const auto& component = entity->GetComponent<ComponentType>(); const auto&component=entity->GetComponent(); 然后,上面的函数将如下所示: template <typename TyComponent> TyComponent* Entity<T>::GetCompone

我一直在努力创建我自己的实体组件系统,我开始通过以下操作获得组件:

const auto& component = entity->GetComponent<ComponentType>();
const auto&component=entity->GetComponent();
然后,上面的函数将如下所示:

template <typename TyComponent>
TyComponent* Entity<T>::GetComponent() const
{
  return &(GetComponent(TyComponent::Id());
}
模板
TyComponent*实体::GetComponent()常量
{
return&(GetComponent(TyComponent::Id());
}
然后,如果找到相关id,则返回一个组件,否则
nullptr

  • 我正在做的事情可行吗
  • 是否有一种方法可以确保只能使用从组件派生的类型 用作
    GetComponent
    的参数
  • 这个设计还可以

    如果有人尝试
    GetComponent
    ,您已经会得到编译时错误,但是
    Foo
    没有静态
    Id()
    函数。因此,这给了您一点安全性

    但是,它仍然需要一个修改才能编译。下面是我的方法:

    Component * GetComponent(int id) { ... }
    
    template <typename TyComponent>
    TyComponent* Entity<T>::GetComponent() const {
      return dynamic_cast<TyComponent*>(GetComponent(TyComponent::Id()));
    }
    
    Component*GetComponent(int-id){…}
    模板
    TyComponent*实体::GetComponent()常量{
    返回动态_cast(GetComponent(TyComponent::Id());
    }
    

    TyComponent
    不是从
    Component
    派生时,这将生成一个编译错误(组件至少需要一个虚拟函数才能工作)。

    对于编译时检查来说,
    static\u cast
    难道不足够吗?@πάνταῥεῖ 你是对的。在这种情况下,你可以通过一个
    静态\u cast
    逃脱,但我更喜欢获得一个空值的额外安全性,而不是获得未定义的行为,如果出现问题。。。