我有一个类模板的层次结构。层次结构的顶部是一个抽象基类(接口)。我不知道在运行时实例化哪个具体实现,所以使用工厂模式似乎是完美的情况。但是,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>;
}
};
答案 0 :(得分:3)
为什么你不能在IProductFactory
上对T
进行模板化?这样就可以摆脱你的错误,并且不会那么普遍。客户仍然需要知道T
是什么才能调用createProduct
方法。
编辑回复:评论
为了做到这一点,你需要创建一个模板化的函数来创建工厂。所以:
template<class T> IProductFactory<T>* getProductFactory();
现在您的工厂已经模板化,createProduct
方法不再是成员模板。不确定返回ProductAFactory
与ProductBFactory
的条件是什么,但是您必须传入一个字符串进行选择,让它成为另一个可以做出决定的类的成员函数,或者具有多个自由函数,但只将一个版本或另一个版本暴露给特定客户端。
答案 1 :(得分:-1)
这不需要模板。这会消除你的问题吗?