Pregunta

Necesito almacenar una serie de puntos de datos en forma de (nombre, valor), donde el valor podría tomar diferentes tipos.

Estoy intentando utilizar una plantilla de clase para cada punto de datos.Luego, para cada punto de datos que veo, quiero crear un nuevo objeto y volver a colocarlo en un vector.Para cada tipo nuevo, primero necesito crear una nueva clase a partir de la plantilla.Pero no puedo almacenar los objetos creados en ningún vector, ya que los vectores esperan el mismo tipo para todas las entradas.Los tipos que necesito almacenar no pueden encajar en una jerarquía de herencia.No están relacionados.Además, es posible que se creen más tipos en el futuro y no quiero cambiar el servicio de almacenamiento para cada nuevo tipo.¿Existe alguna forma de crear un contenedor heterogéneo para almacenar estas entradas?¡Gracias!

¿Fue útil?

Solución

La biblioteca de BOOST tiene probablemente lo que está buscando (BOOST :: CUALQUIER).Puede rodar su propio uso de un enfoque de puntero envuelto si no puede usar BOOST ...

Otros consejos

boost::any Ya ha sido recomendado, sin embargo es para cualquier cosa, por lo que no se puede esperar mucho de él.

Si conoce los distintos tipos de antemano, será mejor que utilice boost::variant.

typedef boost::variant<Foo, Bar, Joe> variant_type;

struct Print: boost::static_visitor<>
{
  void operator()(Foo const& f) const { f.print(std::cout); }

  template <class T>
  void operator()(T const& t) const { std::cout << t << '\n'; }
};

void func(variant_type const& v) // not template
{
  boost::apply_visitor(Print(), v); // compile-time checking
                                    // that all types are handled
}

El problema con los contenedores como este es que cuando desea acceder a algo en el contenedor, debe determinar su tipo y luego lanzarlo al tipo real de alguna manera.Esto es feo, ineficiente y propenso a errores, por lo que la opción # 1 en C ++ es usar la herencia, a menos que tenga una muy buena razón para no, algo que nunca he encontrado en mi carrera de C ++.

Estaba pensando que podría tener un par (tipo, void *) y escribir su propia función pop que arroja el vacío * dependiendo del tipo describir en el par y luego empujarlos en cualquier contenedor atrapa su ojo.

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