¿Cómo crear un contenedor que tome un objeto de cada tipo?

Intenté crear un contenedor para posibles metadatos que se puedan adjuntar a mis objetos. Puedo garantizar que habrá como máximo un objeto de cada tipo adjunto a mi clase, pero no hay límite para objetos de tipo diferente para adjuntar. por ejemplo, no puedo adjuntar dos instancias de wordInfo a un objeto, pero instancias de wordInfo y phraseInfo las clases se pueden adjuntar a un objeto al mismo tiempo. esto es lo que hice hasta ahora para hacerlo.

class object
{
    std::map <std::type_info, object*> mMetaData;
    public:
    inline void attachMetaData(object* pData)
    {
        mMetaData[typeid(*pData)] = pData;
    }
    template <class T> inline std::enableif<std::is_base_of<object,T>::value, T*>::type getMetaData()
    {
        if (mMetaData.find(typeid(T)) == mMetaData.end())
            return NULL;
        else
            return mMetaData[typeid(T)];
    }
    template <class T> inline std::enableif<std::is_base_of<object,T>::value, void>::type detachMetaData()
    {
        mMetaData.erase(typeid(T));
    }
}

el código anterior tenía un error de compilación: menos operador no se definió para std::type_info así que definí una clase menos específica para std::type_info y páselo como el tercer parámetro de plantilla de la clase de mapa como este:

struct typeinfoless
{
    bool operator()(std::type_info& left, std::type_info& right)
    {
        return left.hash() < right.hash();
    }
}
std::map <std::type_info, object*, typeinfoless> mMetaData;

pero luego encontré otro error que no sé cómo resolver, std::type_info tiene un constructor privado e incluso un constructor de copia privado, por lo que ni siquiera puedo derivar alguna clase de él. ¿Alguna idea de cómo puedo solucionar este problema? o cualquier otra forma posible de crear mi object ¿clase?

preguntado el 20 de junio de 11 a las 21:06

también, la discusión en stackoverflow.com/questions/3552135/… es probablemente aún más apropiado -

@cubbi: parece que no, tengo la función hash que era la pregunta principal en la que marcó. No estoy seguro de si es la implementación de VC ++ o qué, pero type_info tiene la función hash y puedo usarla fácilmente, mi problema es crear una clase de mapa con type_info como clave porque obtuve un error type_info :: type_info es inaccesible. -

@cubbi: y sobre su primera sugerencia, parece que puedo usar eso para resolver mi problema, pero no da un consejo sobre cómo usar std :: type_info estándar o el objeto typeid en c ++, redefine los objetos RTTI en sí mismos. -

@cubbi: typeid tiene una gran característica sobre las respuestas en su primera discusión: ambos pueden llamar typeid(int) y int i; typeid(i) y ambos vuelven lo mismo. que no sé cómo generar usando la respuesta allí. -

2 Respuestas

Cree una clase contenedora para std :: type_info, similar a la siguiente:

class TypeWrapper
{
    private const std::type_info &mInfo;
    public TypeWrapper(const std::type_info &info) : mInfo(info)
    {
    }
    // Functions required by a key into a std::map.
};

Utilizan TypeWrapper como su clave en su mapa.

Respondido el 21 de junio de 11 a las 01:06

parece que el valor de retorno de typeid no es std::type_info y no std::type_info&. entonces no puedo llamar TypeWrapper(typeid(int)) - Ali1S232

Disculpas por responder una pregunta antigua, pero este fue el primer resultado en Google cuando traté de resolverlo. En lugar de crear una clase contenedora, debe usar el std::type_index wrapper class como la clave en su mapa.

Respondido 06 Oct 12, 17:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.