¿Cómo funciona Unity's GetComponent ()?

He estado experimentando con la creación de un sistema basado en componentes similar al de Unity, pero en C ++. Me pregunto cómo funciona el método GetComponent () que implementa Unity. Es una función muy poderosa. Específicamente, quiero saber qué tipo de contenedor utiliza para almacenar sus componentes.

Los dos criterios que necesito en mi clon de esta función son los siguientes. 1. Necesito que también se devuelvan los componentes heredados. Por ejemplo, si SphereCollider hereda Collider, GetComponent <Collider> () devolverá el SphereCollider adjunto al GameObject, pero GetComponent <SphereCollider> () no devolverá ningún Collider adjunto. 2. Necesito que la función sea rápida. Preferiblemente, usaría algún tipo de función hash.

Para el criterio uno, sé que podría usar algo similar a la siguiente implementación

std::vector<Component*> components
template <typename T>
T* GetComponent()
{
    for each (Component* c in components)
        if (dynamic_cast<T>(*c))
            return (T*)c;
    return nullptr;
}

Pero eso no se ajusta al segundo criterio de ser rápido. Por eso, sé que podría hacer algo como esto.

std::unordered_map<type_index, Component*> components
template <typename T>
T* GetComponent()
{
    return (T*)components[typeid(T)];
}

Pero, de nuevo, eso no se ajusta al primer criterio.

Si alguien sabe de alguna manera de combinar esas dos características, incluso si es un poco más lento que el segundo ejemplo, estaría dispuesto a sacrificar un poco. ¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta