Проблема сравнения двух функций - PullRequest
0 голосов
/ 07 июня 2019

Я пишу библиотеку Arduino (RTTI недоступен на платформе Arduino), цель которой состоит в том, чтобы имитировать систему событий языка action script 3, но, будучи новичком в c ++, я столкнулся с некоторыми проблемами, которых не ожидалкогда я запускаю этот проект: -)

Для краткости эта система основана на трио: Event / Event Dispatcher / Event Listener.Событие (или подклассы события) отправляются диспетчером событий, а прослушиватели событий являются функцией обратного вызова, которая принимает один параметр типа Event.Всякий раз, когда отправляется событие, вызывается каждый слушатель этого типа события.

Вот пример минималистского кода (без реализации реального процесса диспетчеризации), чтобы показать, как он работает:

#include <iostream>
#include <vector>


class Event
{

public:
    std::string type;

    Event(std::string type) : type(type){}
};


class FanEvent : public Event
{

public:
    int fanRPM;

    FanEvent(std::string type, int fanRPM)
            : Event::Event(type), fanRPM(fanRPM){}
};

class EventListener
{

public:
    std::function<void(Event *)> _listener;
    std::string type;

    EventListener(std::string type, std::function<void(Event *)> listener)
            :type(type), _listener(listener){};
};


class ControllerBase
{

private:

    std::vector<EventListener *> _eventListeners;

public:

    void addEventlistener(std::string eventType, std::function<void(Event *)> listener)
    {
        _eventListeners.push_back(new EventListener(eventType, listener));
    };

    void dispatchEvent(Event *event)
    {
        _eventListeners[0]->_listener(event);
    }
};

class FanController : public ControllerBase
{

public:

    void init()
    {
        addEventlistener("speedChange", [this](Event *event)
        {
            this->updateFanStatus(static_cast<FanEvent *>(event));
        });
    }

    void simulateEventDispatching()
    {
        dispatchEvent(new FanEvent("speedChange", 1200));
    };

    void updateFanStatus(FanEvent *event)
    {

        std::cout << "Fan RPM :" << event->fanRPM << std::endl;
    }
};


int main()
{
    FanController fanController;
    fanController.init();
    fanController.simulateEventDispatching();
    return 0;
}

Выход консоли

Число оборотов вентилятора: 1200

Так что в принципе это работает, но у меня есть две проблемы с реализацией процесса диспетчеризации реального события:

  • Я бы хотел запретить добавление eventListener в std :: vector, если последний уже содержит прослушиватель Event, указывающий на ту же функцию прослушивателя, но я не могу найти способ сообщитьесли две std :: function одинаковы.

  • Событие распространяется на слушателя, если значение типа std :: string экземпляра EventListener, указывающего на этот слушатель, равноstd :: string тип значения события.Но я хотел бы проверить, что тип класса события для Event совпадает с параметром типа класса события для прослушивателя. Допустим, у вас есть класс CustomEventA, класс CustomEventB и слушатель, которые регистрируются в CustomEventA со строковым типом= «Изменить».Я не хочу, чтобы этот слушатель был уведомлен, если отправлено CustomEventB со строкой type = «change».

...