Коллекция объектов шаблона с различными параметрами шаблона - PullRequest
2 голосов
/ 21 января 2011

В качестве установки фабричного метода я хочу зарегистрировать функторы, каждый из которых создает объекты различного типа, но соответствует общему интерфейсу, т.е. все объекты создают подклассы базового класса.

Скажи, что у меня есть что-то вроде:

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 Ответ

1 голос
/ 21 января 2011

Это известно как стирание типа и является довольно распространенной идиомой, хотя ваша карта, конечно, может состоять из указателей, обеспечивающих владение, и вы также можете использовать виртуальный деструктор, как большинство здравомыслящих людей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...