Я работаю над библиотекой, которая также содержит модуль обработки событий. У меня есть рабочее доказательство концепции, но меня беспокоит производительность std :: function. Дело в том, что такие события, как MouseMove, будут происходить очень часто. Это вообще актуально здесь? Должен ли я заменить его указателем на функцию или внести какие-либо другие изменения? Спасибо.
class Event
{
EventType type_;
public:
enum class EventType { MouseMove, /* etc */ };
Event(EventType type) : type_{type} {}
EventType Type() const { return type_ };
};
class MouseMoveEvent : public Event
{
int x_; // x point
int y_; // y point
public:
MouseMoveEvent(int x, int y) : Event(EventType::MouseMove), x_{x}, y_{y} {}
};
// SomeSystemClass is some native system class which can receive various system events
class Receiver : public SomeSystemClass
{
// can contain handlers for various events of different receivers
std::function<bool(Receiver*, Event*)> event_procedure_;
// this is called by the system - return value decides if system should process this event
bool OnMouseMove(int x, int y) override
{
if (event_procedure_)
{
MouseMoveEvent me(x, y);
return event_procedure_(this, &me);
}
return false; // event was not processed -> continue to process by the system
}
public:
template <typename F>
void SetEventProcedure(F&& event_proc)
{
event_proc_ = std::forward<F>(event_proc);
}
const std::function<bool(BaseGUIObject*, Event*)>& EventProcedure() const
{
return event_procedure_;
}
};
// ---------------------------------------------
// USER CODE
int main()
{
Receiver r;
r.SetEventProcedure([](Receiver* r, Event* e)
{
switch (e->Type())
{
case Event::EventType::MouseMove:
// do something
return true; // event was processed by user -> stop system processing
default:
; // unknown event
}
return false; // system processing
});
}