Разделение имплементации на несколько библиотек

Допустим есть некие абстрактные классы 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++ не поддерживает виртуальные шаблонные методы. Можно ли найти какой то способ обойти это или что можно ещё придумать?


Ответы (0 шт):