Estoy implementando un programa en C++ que puede instanciar mediante programación objetos dados un archivo de entrada que proporciona los nombres de clase y argumentos para pasar a los constructores.Patrón de fábrica de C++ con restricción de constructor heterogéneo
Las clases se derivan de una clase base común, pero su firma de constructor varía.
Se declaran de la siguiente manera:
class Base { ... }
class Class1 : Base { Class1(int a1, int a2); }
class Class2 : Base { Class2(int a1, int a2, int a3); }
... and so on...
Los tipos de argumentos no tienen que ser de tipo int, de hecho, podrían ser cualquier tipo incorporado o compleja, de tipo personalizado.
La entrada del programa podría tener este aspecto en forma de JSON:
[
{ "Class1": ["arg11", "arg12"] },
{ "Class2": ["arg21", "arg22", "arg23"] },
...and so on...
]
Lectura a través de los documentos de Boost.Functional/Factory parece que se podría solucionar mi problema si no fuera por el hecho de que en mi solicitud la firma constructora varía (la restricción de heterogeneidad). El enfoque de Boost.Function/Factory es normalizar las firmas de los constructores; sin embargo, esto no es posible en mi aplicación.
En un lenguaje dinámico como Python, esto sería bastante trivial: obj = klass(*args)
donde klass = Class1
y args = ["arg11, "arg12"]
.
Entonces, ¿cómo se podría implementar el patrón de fábrica con la restricción heterogénea en C++?
¿Hay otras bibliotecas además de Boost que he pasado por alto que pueden ser de ayuda?
¿Es posible implementar esto de modo que la única dependencia sea la biblioteca estándar (es decir, no Boost)?
Además, en el caso en que un argumento de constructor es de un tipo complejo, por lo que debe construirse especialmente a partir de su representación JSON, ¿cómo afecta la complejidad del problema?
Para referencia futura, lo opuesto a la homogénea es heterogénea –
Hola Seth, 'homogéneo' también es una palabra válida según el diccionario Merriam-Webster y tiene un significado similar a 'heterogénea'. Elegí la primera porque esa también es la opción de la documentación de Boost.Function/Factory (ver el enlace en mi publicación). –
Sí, lo sé, puede agregar "in" o "un" a casi cualquier palabra y seguirá siendo una palabra. Simplemente suena raro. –