Фабричный шаблон и шаблоны классов в C ++ - PullRequest
0 голосов
/ 11 августа 2010

У меня есть иерархия шаблонов классов.На вершине иерархии находится абстрактный базовый класс (интерфейс).Я не буду знать, какую конкретную реализацию нужно создать до времени выполнения, поэтому кажется идеальной ситуацией использовать фабричный шаблон.Тем не менее, шаблоны виртуальных функций-членов не разрешены в C ++.

Как можно добиться юридического оформления, аналогичного приведенному ниже в 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>;
   }
};

Ответы [ 2 ]

3 голосов
/ 11 августа 2010

Почему вы не можете также шаблонизировать IProductFactory на T?Это избавит вас от вашей ошибки, и она не менее общая.Клиент все еще должен знать, что такое T, чтобы вызвать метод createProduct.

Редактировать Re: comment

Для того, чтобы сделатьдля этого вам нужно будет просто создать шаблонную функцию для создания фабрики.Итак:

template<class T> IProductFactory<T>* getProductFactory();

Теперь ваша фабрика шаблонизирована, метод createProduct больше не является шаблоном элемента.Не уверен, каков ваш критерий для возврата ProductAFactory против ProductBFactory, но вам придется либо передать строку, чтобы выбрать, иметь ли это функцию-член другого класса, которая будет принимать решение, или иметь несколько свободныхфункции, но предоставляют одну или другую версию конкретному клиенту.

0 голосов
/ 11 августа 2010

Для этого не нужен шаблон. Устраняет ли это вашу проблему?

...