У меня есть иерархия шаблонов классов. На вершине иерархии находится абстрактный базовый класс (интерфейс). Я не буду знать, какую конкретную реализацию создать до времени выполнения, поэтому кажется идеальной ситуацией использовать заводской шаблон. Однако шаблоны виртуальных функций-членов не разрешены в C++.
Как я могу добиться юридического дизайна, подобного приведенному ниже, на С++?
Отдельные конкретные реализации интерфейса IProduct, а также конкретные фабрики будут находиться в разных динамических библиотеках, одна или несколько из которых будут загружены во время выполнения.
template<class T> class IProduct
{
public:
virtual void doWork(const T & data) = 0;
};
template<class T> class ProductA : public IProduct<T> {/*...*/};
template<class T> class ProductB : public IProduct<T> {/*...*/};
class IProductFactory
{
public:
template<class T> virtual IProduct<T> * createProduct() = 0;
};
class ProductAFactory: public IProductFactory
{
public:
template<class T> virtual IProduct<T> * createProduct()
{
return new ProductA<T>;
}
};
class ProductBFactory: public IProductFactory
{
public:
template<class T> virtual IProduct<T> * createProduct()
{
return new ProductB<T>;
}
};
ProductA<T>::doWork
,ProductB<T>::doWork
и т. д. для всех T, требуемых основной программой, и если ProductA, ProductB и т. д. прячутся в разделяемых библиотеках, это может быть невозможно сделать это. - person zwol   schedule 11.08.2010