Sto implementando un programma C++ che può istanziare a livello di codice oggetti dati un file di input che fornisce i nomi delle classi e gli argomenti da passare ai costruttori.Modello di fabbrica in C++ con vincolo di costruzione eterogeneo
Le classi derivano da una classe base comune ma la loro firma del costruttore varia.
Essi sono dichiarati come segue:
class Base { ... }
class Class1 : Base { Class1(int a1, int a2); }
class Class2 : Base { Class2(int a1, int a2, int a3); }
... and so on...
I tipi di argomenti non devono essere Int di, in realtà potrebbe essere qualsiasi tipo built-in o complessi, tipo personalizzato.
L'ingresso programma potrebbe apparire così in forma JSON:
[
{ "Class1": ["arg11", "arg12"] },
{ "Class2": ["arg21", "arg22", "arg23"] },
...and so on...
]
Leggendo la documentazione per Boost.Functional/Factory sembra che potrebbe risolvere il mio problema se non fosse per il fatto che nella mia richiesta la firma del costruttore varia (il vincolo di eterogeneità). L'approccio Boost.Function/Factory è quello di normalizzare le firme del costruttore, tuttavia ciò non è possibile nella mia applicazione.
In un linguaggio dinamico come Python, questo sarebbe piuttosto banale: obj = klass(*args)
dove klass = Class1
e args = ["arg11, "arg12"]
.
Quindi, come si dovrebbe implementare lo schema di fabbrica con il vincolo eterogeneo in C++?
Ci sono altre librerie oltre a Boost che ho trascurato che potrebbero essere d'aiuto?
È possibile implementarlo in modo tale che l'unica dipendenza sia la libreria standard (cioè senza Boost)?
Inoltre, nel caso in cui un argomento del costruttore sia di tipo complesso in modo che debba essere appositamente costruito dalla sua rappresentazione JSON, in che modo influisce sulla complessità del problema?
Per riferimento futuro, il contrario di omogenea è eterogenea –
Hey Seth, 'disomogenea' è anche una parola valida secondo il dizionario Merriam-Webster ed è simile al significato di 'eterogenea'. Ho scelto il primo perché è anche la scelta della documentazione di Boost.Function/Factory (vedi il link nel mio post). –
Sì, lo so, è possibile aggiungere "in" o "un" a quasi tutte le parole e sarà ancora una parola. Sembra strano. –