В качестве установки фабричного метода я хочу зарегистрировать функторы, каждый из которых создает объекты различного типа, но соответствует общему интерфейсу, т.е. все объекты создают подклассы базового класса.
Скажи, что у меня есть что-то вроде:
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), чтобы создать правильный тип.