Я реализую программу на C ++, которая может программно создавать экземпляры объектов с учетом входного файла, который предоставляет имена классов и аргументы для передачи конструкторам.
Классы являются производными от общего базового класса, но их сигнатура конструктора различается.
Они объявлены следующим образом:
class Base { ... }
class Class1 : Base { Class1(int a1, int a2); }
class Class2 : Base { Class2(int a1, int a2, int a3); }
... and so on...
Типы аргументов не обязательно должны быть int, на самом деле они могут быть любым встроенным типом или сложным, настраиваемым типом.
Ввод программы мог бы выглядеть следующим образом в форме JSON:
[
{ "Class1": ["arg11", "arg12"] },
{ "Class2": ["arg21", "arg22", "arg23"] },
...and so on...
]
При чтении документации для Boost.Functional / Factory выясняется, что он мог бы решить мою проблему, если бы не тот факт, что в моем приложения подпись конструктора меняется (ограничение неоднородности). Подход Boost.Function / Factory заключается в нормализации сигнатуры конструктора, однако в моем приложении это невозможно.
На динамическом языке, таком как Python, это было бы довольно тривиально: obj = klass (* args)
где klass = Class1
и args = ["arg11," arg12 "]
.
Итак, как можно реализовать фабричный шаблон с гетерогенным ограничением в C ++?
Существуют ли другие библиотеки, помимо Boost, которые я упустил из виду, которые могут быть полезными?
можно ли реализовать это так, чтобы единственной зависимостью была стандартная библиотека (т.е. без Boost)?
Кроме того, в случае, когда аргумент конструктора имеет сложный тип, так что он должен быть специально сконструирован из его представления JSON, как влияет ли это на сложность проблемы?