2011-01-20 78 views
2

作为一种工厂方法设置,我希望注册函子,每个函子都创建不同类型的对象,但满足一个通用接口 - 即所有创建子类为核心类的创建对象。具有不同模板参数的模板对象的集合

说我有这样的:

template <class T> struct FactoryMethod 
{ 
X* create(); 
} 

我不能有(IIRC)std::map<std::string,FactoryMethod*>因为每个FactoryMethod模板专业化是一个独立的类型。但我可以做到:

struct IFactoryMethod 
{ 
virtual X* create()=0; 
}; 
template <class T> struct FactoryMethod : public IFactoryMethod 
{ 
virtual X* create(); 
}; 
std::map<std::string,IFactoryMethod*> factories; 

,对吗?我不知道标准STL有办法使这个整洁,但我猜是提升 - 但是我们现在不使用提升,我仍然有兴趣。

然后想法是factories可以根据类型名称(例如从XML读取)来查找以创建正确的类型。

回答

1

这被称为类型擦除,并且是一个相当常见的习惯用语 - 虽然您的地图当然可以由所有权执行指针组成,您也可以像大多数理智的人一样使用虚拟析构函数。

+0

它是伪代码,给我一个休息!虽然你能澄清“所有权执行指针”吗? – 2011-01-20 22:25:43