¿Cuál es la forma más elegante de proporcionar una interfaz en C++ que acepta tipos de clases derivadas que llevan consigo diferentes tipos de datos para luego recuperarlos? El siguiente ejemplo ilustra esto donde la clase Container proporciona métodos para "publicar" un elemento que será algún tipo de variante derivada de BaseItem. Más tarde quiero recuperar el artículo derivado y extraer su valor.La mejor manera para que las clases derivadas transporten diferentes tipos de datos en C++
Lo principal que quiero es que la interfaz del contenedor (publicar y recibir) permanezca igual en el futuro al mismo tiempo que permite que diferentes tipos derivados de "elementos" se definan y "pasen" a través de él. La plantilla sería mejor para esto de alguna manera; Prefiero no usar RTTI. Tal vez haya alguna respuesta simple y elegante a esto, pero ahora estoy luchando por pensarlo.
class ItemBase {
// common methods
};
class ItemInt : public ItemBase
{
private:
int dat;
public:
int get() { return dat; }
};
class ItemDouble : public ItemBase
{
private:
double dat;
public:
double get() { return dat; }
};
class Container {
public:
void post(int postHandle, ItemBase *e);
ItemBase* receive(int handle); // Returns the associated Item
};
int main()
{
ItemInt *ii = new IntItem(5);
Container c;
c.post(1, ii);
ItemInt *jj = c.receive(1);
int val = jj->get(); // want the value 5 out of the IntItem
}
Pruebe Boost.any, que hace algo muy similar. –
También tenga en cuenta que el código publicado tiene el problema del 'get' de cada objeto con un tipo de devolución diferente. Si no puede hacer que sean del mismo tipo, tendrá que devolver un stringstream o algo así. –
Sí, estoy de acuerdo, pero la función get() no es una función virtual. Es "funcionalidad separada" que cada clase derivada "agrega". Hay otra funcionalidad común que hace que la herencia sea "necesaria" –