Система обработки пользовательских событий c ++ - PullRequest
1 голос
/ 05 августа 2020

Я работаю над библиотекой, которая также содержит модуль обработки событий. У меня есть рабочее доказательство концепции, но меня беспокоит производительность 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
    });

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