C++ no admite contenedores heterogéneos.
Si no va a utilizar boost
el truco es crear una clase ficticia y tener todas las clases diferentes derivadas de esta clase ficticia. Cree un contenedor de su elección para mantener los objetos de la clase ficticia y ya está listo para comenzar.
class Dummy {
virtual void whoami() = 0;
};
class Lizard : public Dummy {
virtual void whoami() { std::cout << "I'm a lizard!\n"; }
};
class Transporter : public Dummy {
virtual void whoami() { std::cout << "I'm Jason Statham!\n"; }
};
int main() {
std::list<Dummy*> hateList;
hateList.insert(new Transporter());
hateList.insert(new Lizard());
std::for_each(hateList.begin(), hateList.end(),
std::mem_fun(&Dummy::whoami));
// yes, I'm leaking memory, but that's besides the point
}
Si va a utilizar boost
puede probar boost::any
. Here es un ejemplo del uso de boost::any
.
Puede encontrar este excelente article por dos destacados expertos en C++ de interés.
Ahora, boost::variant
es otra cosa a tener en cuenta como j_random_hacker mencionado. Entonces, aquí hay un comparison para tener una idea clara de qué usar.
Con un boost::variant
el código anterior sería algo como esto:
class Lizard {
void whoami() { std::cout << "I'm a lizard!\n"; }
};
class Transporter {
void whoami() { std::cout << "I'm Jason Statham!\n"; }
};
int main() {
std::vector< boost::variant<Lizard, Transporter> > hateList;
hateList.push_back(Lizard());
hateList.push_back(Transporter());
std::for_each(hateList.begin(), hateList.end(), std::mem_fun(&Dummy::whoami));
}
¿Qué tipo de uso tienen los programadores Java para contenedores heterogéneos? –
99% de las veces es una mala idea, pero he visto casos en los que funciona. Un ejemplo es una colección de tipo A, pero algunos objetos también pueden implementar el tipo B (es decir, Cerrar). Puede realizar 1 op en toda la colección, pero solo .close() los que se pueden cerrar. –
@Outlaw: en ese caso, mantendría una colección separada con punteros de tipo B * que apuntan a objetos en la colección "principal" y perforamos .close() en la segunda colección. Más rápido y más seguro que determinar el tipo en tiempo de ejecución. –