Estimados,
Tengo un problema concreto, no obstante es muy común aunque no encuentro una forma simple de resolverlo sin complicarlo demasiado.
El problema es la de separar los datos de la forma de imprimirlos, el problema radica en que a la forma de imprimirlos se le suman datos adicionales que no se encuentran en el objeto original.
Por oto lado ya dispongo de la implementacion de las clases para implementar un dispatcher para poder evaluar en función del tipo especifico.
Vamos al codigo de ejemplo:
struct Der1;
struct Der2;
struct Visitor
{
virtual void exec(Der1 &) = 0;
virtual void exec(Der2 &) = 0;
};
struct Base
{
virtual void accept(Visitor &) = 0;
};
struct Der1 : Base
{
virtual void accept(Visitor & visitor)
{
visitor.exec(*this);
}
};
struct Der2 : Base
{
virtual void accept(Visitor & visitor)
{
visitor.exec(*this);
}
};
struct Printer : Visitor
{
std::string output;
virtual void exec(Der1 &)
{
// En este punto no tengo forma directa de tener la ExtraData
// Lo que si puedo hacer es construir un printer concreto para cada Objeto Der al que le pase luego la extra data
// En otras palabras esta clase podrida ser un printer builder para retornar un printer especifico para cada Der,
// En ese caso, tambien me queda la duda de como almacenar la info de Der, ya que no me gustaria mantener una referencia por si luego ese printer se encola para procesarla luego.
}
virtual void exec(Der2 &)
{
}
};
struct ExtraData
{
// data
};
int main()
{
Der1 d;
Printer p;
d.accept(p);
std::cout << p.output;
}
Esto debe ser mas comun de lo que pienso y creo aun me la estoy complicando.
Hay que agregar que el echo que el accept no retorna nada no me simplifica la cosa, pero agregar otra funcion virtual que me retorne un printer me parece que estaria acoplando demasiado
Alguna idea?
Muchas Gracias