作为一种工厂方法设置,我想注册仿函数,每个仿函数创建不同类型的对象,但满足一个公共(public)接口(interface)——即所有创建对象子类化一个核心类。
假设我有这样的东西:
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 有办法使它更整洁,但我猜 boost 可以 - 但是我们现在不使用 boost,无论如何我都很感兴趣。
然后思路是factories
可以根据类型名称(例如从 XML 中读取)进行查找以创建正确的类型。
最佳答案
这被称为类型删除,是一种相当常见的习惯用法 - 虽然您的映射当然可以由所有权强制指针组成,并且您也可以像大多数理智的人一样使用虚拟析构函数。
关于c++ - 具有不同模板参数的模板对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753299/