Разделение имплементации на несколько библиотек
Допустим есть некие абстрактные классы A и B. У этих классов может быть несколько имплементаций, которые находятся в разных библиотеках (AImpl1, AImpl2 и BImpl1, BImpl2)
Теперь я хочу иметь простой способ создания классов A и B, при этом не зная об их имплементациях (я знаю только то что существует библиотеки Impl1 и Impl2, в которых есть нужные имплементации)
//Core библиотека
class A {};
template <class T>
class B {};
//Библиотека 1
class AImpl1 : public A {};
template <class T>
class BImpl1 : public B<T> {};
//Библиотека 2
class AImpl2 : public A {};
template <class T>
class BImpl2 : public B<T> {};
//Main
A a = //Создание A
B<T> b = //Создание B<T>
Была идея сделать типо класса билдера, который должен будет реализовываться в каждой из библиотек и при старте приложения, я просто буду нужный билдер прокидывать через IoC контейнер или статическое поле
//Core библиотека
class IBuilder
{
virtual A createA() = 0;
template <class T>
virtual B<T> createB() = 0;
};
//Библиотека 1
class Builder1 : public IBuilder
{
A createA() override;
template <class T>
B<T> createB() override;
};
//Библиотека 2
class Builder2 : public IBuilder
{
A createA() override;
template <class T>
B<T> createB() override;
};
//Main
Global::builder = Builder1();
A a = Global::builder.createA();
B<T> b = Global::builder.createB<T>();
Но я не могу сделать такое, потому что C++ не поддерживает виртуальные шаблонные методы. Можно ли найти какой то способ обойти это или что можно ещё придумать?