作为一种工厂方法设置,我想注册仿函数,每个仿函数创建不同类型的对象,但遇到一个公共接口 - 即所有创建对象都是子类化核心类。
说我有类似的东西:
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有办法使这个更整洁,虽然我猜想提升 - 但是我们现在不使用提升而且我还是感兴趣。
然后可以根据类型名称(例如从XML读取)查找factories
以创建正确的类型。
答案 0 :(得分:1)
这被称为类型擦除,并且是一种相当常见的习惯用法 - 虽然你的地图当然可以由所有权执行指针构成,你也可以像大多数理智的人一样使用虚拟析构函数。