【发布时间】:2010-08-11 17:20:20
【问题描述】:
我有一个类模板的层次结构。层次结构的顶部是一个抽象基类(接口)。直到运行时我才知道要实例化哪个具体实现,因此使用工厂模式似乎是完美的情况。但是,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>;
}
};
【问题讨论】:
-
你用模板参数做什么?如图所示,您似乎应该直接删除它。
-
@Zack,模板参数用作接口功能之一的参数类型。我会澄清的。
-
如上所述,您要求实例化麻烦 - 有人将不得不实例化
ProductA<T>::doWork、ProductB<T>::doWork等,对于主程序所需的所有 T,如果 ProductA、ProductB、等隐藏在共享库中,可能无法这样做。
标签: c++ design-patterns templates factory