Я пытаюсь реализовать класс, который позволил бы прослушивать некоторые события, и когда эти испускаются, они будут получать уведомления.
Так что я подумал об использовании Функторов,
class MyFunctor {
public:
virtual void emit() {}
vitual void compare() {}
};
class MyFunctorSpecial : public MyFunctor {
void (*)() ab;
public:
MyFunctorSpecial(void (*a)()) : ab(a) {}
void emit() { ab(); }
};
class EventEmitter {
std::map<std::string, std::vector<MyFunctor> > eventMap;
public:
void On(const std::string &, const MyFunctor &) {
// add to the map
}
void Emit(const std::string & eventName) {
// emit the event
// for all listeners in the vector for this event-name
// call the emit of them.
}
};
EventEmitter emitter;
// some function - abc()
MyFunctorSpecial funct(abc);
emitter.On("hello", funct);
emitter.Emit("hello");
Но теперь я хочу передать аргументы слушателям. подобно
emitter.Emit("hello", 45, false);
Я думаю, что эта информация будет доступна для Emit()
во время компиляции, о типах данных различных аргументов. Могу ли я использовать эту информацию, чтобы сделать это, используя шаблоны или что-нибудь еще.
Есть ли другой тип паттерна для этой проблемы? Как я могу это сделать?
Общий шаблон дизайна для вашей проблемы называется Наблюдатель Дизайн-Шаблон.
Ваши так называемые «функторы» не функторы.
В таком случае они бы реализовали метод operator () и могли бы вызываться как функции (таким образом, функтор имени). Ваш нет.
Например, это функтор: (обратите внимание на Оператор ())
class MyFunctor
{
public:
void operator()(){};
};
Других решений пока нет …