Как сохранить список типов классов, которые потом (в runtime) должны быть вызваны в параметре шаблона?

Есть некоторая иерархия абстрактных базовых классов с набором конкретных классов;
Foo1Base: 
Foo1Concrete1; Foo1Concrete2; ...
Foo2Base:
Foo2Concrete1; Foo2Concrete2; ...

Для их создания применяется шаблонная фабрика
template <class T> FooFactory {
void Register(int id);
T* Create(int), 
vector<int> GetAvaliable();
}

Соответсвенно, использование:
Factory<Foo1Base>.Create(...)

Теперь есть некоторые другие конкретные классы
BarBase:
BarConcrete1;BarConcrete2;...

Для создания применяется обычная фабрика.
Каждый из конкретных классов использует определенный набор из базовых классов Foo#Base, известный во время компиляции.

Еще до создания конкретного Bar необходимо знать какие из базовых классов Foo будут в нем использоваться. Соответсвенно, в моем понимании у фабрики Bar есть метод, который должен возвращать список с типами используемых параметров, что бы вызвать шаблонную фабрику Foo с каждым из этих параметров, т.е:

Псевдокод:
for( foo_type : vector<FooTypeHolder>) {
auto foos_ = FooFactory <foo_type >.GetAvaliable()
}

Как такое реализовать? Куда копать?
  • Вопрос задан
  • 431 просмотр
Пригласить эксперта
Ответы на вопрос 4
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
www.boost.org/doc/libs/1_59_0/libs/mpl/doc/refmanu... возможно что-то из boost mpl вам поможет. Но очень не рекомендуется это делать в pruduction коде. Такой код обычно очень дорого поддерживать.
Ответ написан
maaGames
@maaGames
Погроммирую программы
Шаблоны инстанцируются при компиляции. Т.е. в рантайме с шаблонами делать ничего нельзя, потому что в рантайме шаблонов нет.
Ответ написан
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Рыть в направлении variadic template + loop

stackoverflow.com/questions/7230621/how-can-i-iter...
Ответ написан
Комментировать
snizovtsev
@snizovtsev
Маньячу C++
Попахивает dependency injection. Посмотрите на https://github.com/boost-experimental/di или https://github.com/google/fruit
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы