Я работал над созданием собственной системы компонентов сущностей, и я настроен на возможность получить компонент, выполнив следующие действия:
const auto& component = entity->GetComponent<ComponentType>();
Вышеуказанная функция будет выглядеть примерно так:
template <typename TyComponent>
TyComponent* Entity<T>::GetComponent() const
{
return &(GetComponent(TyComponent::Id());
}
Который затем возвращает компонент на основе связанного идентификатора, если найден, иначе nullptr
,
GetComponent
?Этот дизайн в порядке.
Вы уже получите ошибку времени компиляции, если кто-то попытается 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
, (Для работы компонента потребуется хотя бы одна виртуальная функция.)