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
逃脱,但我更喜欢获得一个空值的额外安全性,而不是获得未定义的行为,如果出现问题。。。