Foros del Web » Programación para mayores de 30 ;) » C/C++ »

std::map generico con template<typename T>

Estas en el tema de std::map generico con template<typename T> en el foro de C/C++ en Foros del Web. Hola a todos, como estan? hace una semana que estoy con una duda que no puedo solventar. Intento realizar lo siguiente: un contenedor std::map que ...
  #1 (permalink)  
Antiguo 09/07/2012, 19:20
Usuario no validado
 
Fecha de Ingreso: febrero-2012
Mensajes: 24
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta std::map generico con template<typename T>

Hola a todos, como estan? hace una semana que estoy con una duda que no puedo solventar. Intento realizar lo siguiente:

un contenedor std::map que almacene &objetos de clases distintas (Detalle: estas clases crean figuras geometricas y tienen un metodo común "dibujar()")

pero el problema está en que no encuentro la forma de hacerlo ya que C++ no permite hacer lo siguiente:

Código C++:
Ver original
  1. template<typename T>
  2. std::map<char*,T &> Pila;


Al hacerlo dentro de una clase (que es lo que pretendo, una clase que controle la "pila" map) si o si tendría que especificar el tipo de la clase al intanciar un objeto. El problema es que los objetos que aloja la pila, son de distintas clases.

por EJ:
Código C++:
Ver original
  1. template<typename T>
  2. class A
  3. {
  4.  
  5. public:
  6. void dibujar();
  7. private:
  8. std::map<char*, T&> Pila;
  9.  
  10. };
  11.  
  12. //instancia
  13. A<Tipo> nuevaPila;

Pero esto tampoco sirve por que necesito que el contentedor map sea unico y aloje varios objetos, no quiero que cree una instancia de la pila para cada objeto "distinto" a guardar.

Ojala alguien me pueda dar una mano con esto por que me esta volviendo loco jeje o alguna alternativa (lo mejor para mi sería manejarlo dentro de una clase, pero bienvenida sea cualquier sugerencia).

Muchas gracias a Todos! Saludos!
  #2 (permalink)  
Antiguo 10/07/2012, 12:48
Avatar de cronopiomx  
Fecha de Ingreso: mayo-2012
Ubicación: Programing Cloud
Mensajes: 282
Antigüedad: 12 años, 6 meses
Puntos: 28
Respuesta: std::map generico con template<typename T>

amigo, explicate mejor sin tu codigo, empieza desde cero, aver si te entiendo...

s2
cronos
  #3 (permalink)  
Antiguo 10/07/2012, 17:13
Usuario no validado
 
Fecha de Ingreso: febrero-2012
Mensajes: 24
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: std::map generico con template<typename T>

Cita:
Iniciado por cronopiomx Ver Mensaje
amigo, explicate mejor sin tu codigo, empieza desde cero, aver si te entiendo...

s2
cronos
Anters que nada, Gracias cronopiomx, simplemente explicado, lo que deseo es guardar en un contenedor (preferentemente map) varios objetos de clases distintas:

Ej

Código C++:
Ver original
  1. claseA objetoA;
  2. claseB objetoB
  3.  
  4. template<typename T>
  5. map<char*, T*> pila
  6.  
  7. //se que esto se hace con pair pero es solo para explicar lo que necesito
  8. pila.insert("nombre1", objetoA);
  9. pila.insert("nombre2", objetoB);

y allí guardar los objetos para luego accederlos por nombre (char*).

Pero como esta parte en C++ no es posible (al menos de que este dentro de una clase o estructura):

Código C++:
Ver original
  1. template<typename T>
  2. map<char*, T*> pila

Alguna sugerencia de como puedo lograr esto? espero esta vez haya sido claro, Saludos a todos y Gracias!
  #4 (permalink)  
Antiguo 11/07/2012, 20:39
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 9 meses
Puntos: 22
Respuesta: std::map generico con template<typename T>

Hola, si los objetos que estás utilizando tienen una interfaz común (como por ejemplo el método draw que mencionaste), entonces puedes crear una clase base para el contenedor.

Ejemplo:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <map>
  3. using namespace std;
  4.  
  5. class Shape{
  6.     public:
  7.     virtual ~Shape(){};
  8.     virtual void draw() = 0;
  9. };
  10.  
  11. class Triangle : public Shape{
  12.     public:
  13.     ~Triangle(){
  14.         cout << "~Triangle()\n";
  15.     }
  16.     void draw(){
  17.         cout << "Triangle::draw()\n";
  18.     }
  19. };
  20.  
  21. class Square : public Shape{
  22.     public:
  23.     ~Square (){
  24.         cout << "~Square()\n";
  25.     }
  26.     void draw(){
  27.         cout << "Square::draw()\n";
  28.     }
  29. };
  30.  
  31.  
  32. class Circle : public Shape{
  33.     public:
  34.     ~Circle(){
  35.         cout << "~Circle()\n";
  36.     }
  37.     void draw(){
  38.         cout << "Circle::draw()\n";
  39.     }
  40. };
  41.  
  42. typedef pair<const char*, Shape*> mypair;
  43.  
  44. int main(){
  45.  
  46.     map<const char*, Shape*> m;
  47.     m.insert(mypair("t1", new Triangle));
  48.     m.insert(mypair("s1", new Square));
  49.     m.insert(mypair("c1", new Circle));
  50.     m.insert(mypair("c2", new Circle));
  51.     m.insert(mypair("s2", new Square));
  52.     m.insert(mypair("t2", new Triangle));
  53.     cout << "map elements: " << m.size() << endl;
  54.  
  55.     m["t1"]->draw();
  56.     m["t2"]->draw();
  57.     m["s1"]->draw();
  58.     m["s2"]->draw();
  59.     m["c1"]->draw();
  60.     m["c2"]->draw();
  61.  
  62.     map<const char*, Shape*>::iterator it = m.begin();
  63.     while(it != m.end()){
  64.         delete (*it).second;
  65.         it++;
  66.     }
  67.     m.clear();
  68.     cout << "map elements: " << m.size() << endl;
  69.  
  70.     return 0;
  71. }

Toma en cuenta que los templates es un trabajo que se realiza a nivel de compilador y no en tiempo de ejecución, por lo que dependiendo de lo que necesites podrás tomarlo en cuenta o descartarlo como una opción viable.
Por lo que llego a entender, me inclino a que te funcione la herencia y polimorfismo (ejemplo). Si únicamente se incrementaron tus dudas, lo mejor es que repases los temas.
Otra opción más especializada es utilizar Boost.Any.
  #5 (permalink)  
Antiguo 12/07/2012, 16:41
Usuario no validado
 
Fecha de Ingreso: febrero-2012
Mensajes: 24
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: std::map generico con template<typename T>

Muchas gracias fightmx! había probado en este tiempo hacer eso tal cual usando la clase "base" como muestras, pero me había surgido un error y ahora no recuerdo cual, de todos modos voy a probarlo nuevamente mas tranquilo y aviso muchas gracias por tu ayuda

Saludos a todos!
  #6 (permalink)  
Antiguo 14/07/2012, 20:49
Usuario no validado
 
Fecha de Ingreso: febrero-2012
Mensajes: 24
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: std::map generico con template<typename T>

Muchas Gracias fightmx! sobre todo por tomarte la molestia de escribir el código que hizo que todo quede mas que claro.

Yo había intentado hacer esto que muestras, pero me daba error por que tenia una funcion en una de las clases a la que le pasaba el objeto de clase "derivada "EJ: triangulo pero lo pasaba por referencia y esta funcion, se encargaba de meterlo en la pila map.

El error que daba es que no se podia convertir un tipo triangulo* a triangulo*&

Al sacarle la referencia & todo funcionó..

Muchas gracias!! Saludos! estoy agreadecido por la ayuda.

Etiquetas: clases, map, templates
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:41.