Поскольку я хочу создавать экземпляры модулей только при фактическом событии, мне нужен любой способхранить указатель на конструктор («виртуальный конструктор»), поскольку, насколько я знаю, нет виртуальных конструкторов, я использую метод Factory, который я хотел бы добавить в интерфейс.Классический подход, о котором я знаю, был бы:
class myInterface {
public:
...
static virtual *myInterface builder() = 0; //is static (pure) virtual possible?
};
class example : public myInterface {
public:
...
static virtual *myInterface builder() { return new example(); }
};
Затем мне пришлось бы хранить указатели на функции builder () в списке событий и выполнять функции в случае возникновения события для создания объектов.Мне интересно, есть ли способ написать static virtual *myInterface builder() { return new example(); }
для каждого примера модуля.Шаблонный подход будет выглядеть так:
шаблон статического виртуального * myInterface builder () {return new T ();}
Однако мне это не очень нравится, поскольку мне нужно было бы написать следующее, чтобы зарегистрировать модуль для события:
register (eventName, builder ())
учитывая, что я хотел бы создать только одну функцию статического регистра в каждом модуле, вот так:
class example: public myInterface {
static void registerMe {
register(event1,builder<example>());
register(event2,builder<example>());
...
register(eventn,builder<example>());
}
};
было бы гораздо удобнее, если бы достаточно было вызова типа register(event)
.я мог бы добавить register(event)
к интерфейсу, но я не хочу переписывать функцию регистра для каждого шаблона, который будет читать
void register(event) { getListForEvent(event).pushBack(builder<example>()); }
(параметр инстанцирования шаблона компоновщика меняется), и сделать его самим шаблономтоже нехорошо, так как это заставляет меня снова и снова писать register<myclass>()
.
Так есть ли более убедительный способ?(Во время обдумывания и написания этого я придумал наследовать от шаблонного класса. Если полиморфизм работает с шаблонными классами с различными параметрами создания экземпляров. В противном случае я должен использовать класс Interface, обернуть его в шаблон и наследовать от него)