У меня есть метод generic c в C#:
public T GetComponent<T>() where T : Component {
foreach (Component component in this.components)
if (component is T c)
return c;
return default(T);
}
Я хочу перевести его на C ++:
template<typename T>
T* GameObject::getComponent() const {
if (!std::is_base_of<Component, T>::value)
return nullptr;
for (auto i = this->components->begin(); i != this->components->end(); i++)
if (typeid(*i) == typeid(T))
return dynamic_cast<T>(*i);
return nullptr;
}
Но, похоже, ни то, ни другое typeid
dynamic_cast
также не может работать с типами c. Как мне этого добиться?
РЕДАКТИРОВАТЬ:
Component* GameObject::getComponent(const type_info& type) const {
for (auto i = this->components->begin(); i != this->components->end(); i++)
if (typeid(*i) == type)
return *i;
return nullptr;
}
Возможное использование:
cg::SpriteRenderer2D* renderer = (cg::SpriteRenderer2D*)getComponent(typeid(cg::SpriteRenderer2D));
Единственная проблема заключается в том, что нет проверки если переданный тип получает Component
. Также я не уверен, что мне нужно разыменовать i
два раза, так что typeid(**i)
. Первый от iterator
до Component*
. Второй от Component*
до Component
. Или я храню список Component&
.