Pregunta

He estado aprendiendo C++, procedente de C#, donde me he acostumbrado a utilizar proveedores de servicios:básicamente un Diccionario <Tipo, objeto>.Desafortunadamente, no puedo entender cómo hacer esto en C++.Entonces las preguntas son básicamente:

  1. ¿Cómo haría un diccionario en C++?

  2. ¿Cómo usaría 'Tipo' con él? Hasta donde yo sé, no hay 'Tipo' en C++.

  3. Igual que el anterior, pero con "objeto".

¡Gracias!

¿Fue útil?

Solución

Supongo que está intentando asignar un tipo a una sola instancia de objeto. Podría probar algo en este sentido:

#include <typeinfo>
#include <map>
#include <string>
using namespace std;

class SomeClass
{
public:
    virtual ~SomeClass() {} // virtual function to get a v-table
};

struct type_info_less
{
    bool operator() (const std::type_info* lhs, const std::type_info* rhs) const
    {
        return lhs->before(*rhs) != 0;
    }
};

class TypeMap
{
    typedef map <type_info *, void *, type_info_less> TypenameToObject;
    TypenameToObject ObjectMap;

public:
    template <typename T> 
    T *Get () const
    {
        TypenameToObject::const_iterator iType = ObjectMap.find(&typeid(T));
        if (iType == ObjectMap.end())
            return NULL;
        return reinterpret_cast<T *>(iType->second);
    }
    template <typename T> 
    void Set(T *value) 
    {
        ObjectMap[&typeid(T)] = reinterpret_cast<void *>(value);
    }
};

int main()
{
    TypeMap Services;
    Services.Set<SomeClass>(new SomeClass());
    SomeClass *x = Services.Get<SomeClass>();
}

En C ++ los tipos no son objetos de primera clase por derecho propio, pero al menos el nombre del tipo será único, por lo que puede teclear con eso.

Editar: no se garantiza que los nombres sean únicos, así que mantén los punteros type_info y usa el método before para compararlos.

Otros consejos

Probablemente desee ver la plantilla de mapa STL . C ++ ciertamente tiene tipos (difícil de tener una herencia sin él), simplemente no hay & Quot; Type & Quot; clase.

El STL tiene dos contenedores asociativos: std::map<K,V> andstd::multimapa.También hay std::set<V> que debería ser un adaptador de std::map<V,void>, pero como tal no es un contenedor asociativo.El mapa múltiple es similar al mapa, solo que permite múltiples claves idénticas dentro del mismo contenedor.Tanto el mapa como el multimapa contienen elementos de tipo std::pair<K,V>.En otras palabras, std::map<K,V>::value_type == std::pair<K,V>, pero std::map<K,V>::key_type == K y std::map<K,V>::mapped_type == V.

En cuanto a "Tipo", no estoy del todo seguro de a qué te refieres.Si te refieres a clases parametrizadas, entonces C++ llama a esto "Programación de plantillas" o "Programación genérica".En lo anterior, std::map<K,V> está parametrizado sobre K y V para el tipo de claves y el tipo de valores.C++ también admite funciones de plantilla:

template<typename T>
void f(T o);

declarará una función que toma como parámetro cualquier tipo, incluidos los tipos primitivos.C++ no admite la resolución de tipos genéricos, por lo que el tipo T debe tener cierta jerarquía.Por ahora, todo lo que puede hacer es asumir que el tipo pasado es de hecho de la jerarquía correcta, y el compilador se quejará si intenta llamar a una función no declarada sobre un objeto de ese tipo.

template<typename T>
void f(T o) {
    o.do_it();
}

Lo anterior funcionará siempre que T defina el método. do_it().

Un diccionario me suena como un mapa STL: std::map<K, T>. Eche un vistazo a la Biblioteca de plantillas estándar: es genial. Ha sido parte de ANSI C ++ por un tiempo. Microsoft tiene una buena implementación de PJ Plauger, si no recuerdo mal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top