Заводской шаблон C ++ с ограничением гетерогенного конструктора

Я реализую программу на 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, как влияет ли это на сложность проблемы?

6
задан Salman Haq 19 December 2011 в 21:09
поделиться