c ++ 11 — система компонентов сущности c ++ и доступ к компонентам с помощью шаблона

Я работал над созданием собственной системы компонентов сущностей, и я настроен на возможность получить компонент, выполнив следующие действия:

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

Вышеуказанная функция будет выглядеть примерно так:

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

Который затем возвращает компонент на основе связанного идентификатора, если найден, иначе nullptr,

  1. Является ли то, что я делаю, жизнеспособным?
  2. Есть ли способ гарантировать, что только типы, полученные из Компонента, могут быть
    используется в качестве параметра для GetComponent?

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, (Для работы компонента потребуется хотя бы одна виртуальная функция.)

2

Другие решения


По вопросам рекламы [email protected]