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#include <iostream>
#include <map>
using namespace std;
class Shape{
public:
virtual ~Shape(){};
virtual void draw() = 0;
};
class Triangle : public Shape{
public:
~Triangle(){
cout << "~Triangle()\n";
}
void draw(){
cout << "Triangle::draw()\n";
}
};
class Square : public Shape{
public:
~Square (){
cout << "~Square()\n";
}
void draw(){
cout << "Square::draw()\n";
}
};
class Circle : public Shape{
public:
~Circle(){
cout << "~Circle()\n";
}
void draw(){
cout << "Circle::draw()\n";
}
};
typedef pair<const char*, Shape*> mypair;
int main(){
map<const char*, Shape*> m;
m.insert(mypair("t1", new Triangle));
m.insert(mypair("s1", new Square));
m.insert(mypair("c1", new Circle));
m.insert(mypair("c2", new Circle));
m.insert(mypair("s2", new Square));
m.insert(mypair("t2", new Triangle));
cout << "map elements: " << m.size() << endl;
m["t1"]->draw();
m["t2"]->draw();
m["s1"]->draw();
m["s2"]->draw();
m["c1"]->draw();
m["c2"]->draw();
map<const char*, Shape*>::iterator it = m.begin();
while(it != m.end()){
delete (*it).second;
it++;
}
m.clear();
cout << "map elements: " << m.size() << endl;
return 0;
}
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.