Ver Mensaje Individual
  #4 (permalink)  
Antiguo 11/07/2012, 20:39
fightmx
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 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.