Я иду из C# и пытаюсь реализовать простой шаблон Event/EventHandler в C++ 11, который, как я полагаю, является общим именем Observer и сигналами, я знаю, что есть библиотека boost и другие, но я не хочу использовать любые внешние библиотеки.C++ 11 Наблюдатели Параметры пропуска на Notify
При поиске в Интернете я нашел простую реализацию для того, что мне нужно, поэтому я взял и изменил код, и он работает нормально.
Моя проблема заключается в том, что параметры передаются при регистрации событий/наблюдателей, а не при повышении/передаче/уведомлении, которые я нахожу немного неудобными.
class EventManager
{
private:
static std::map<EventType, std::vector<std::function<void()>>> _eventHandlers;
public:
EventManager() = default;
template <typename EventHandler>
static void RegisterEventHandler(EventType&& eventType, EventHandler&& eventHandler)
{
EventManager::_eventHandlers[std::move(eventType)].push_back(std::forward<EventHandler>(eventHandler));
}
static void Raise(const EventType& event)
{
for (const auto& eventHandler : EventManager::_eventHandlers.at(event))
{
eventHandler();
}
}
// disallow copying and assigning
EventManager(const EventManager&) = delete;
EventManager& operator=(const EventManager&) = delete;
};
Может ли кто-нибудь помочь мне расширить следующий код, добавив функциональность для приема параметров при поднятии события?
спасибо за ответ, но это не сработает, если методы статичны, так как вам нужно инициализировать класс EventManager и определить шаблоны параметров/параметров для обработчиков событий, правильно? – Ronny
Использование статических методов и статического члена '_handlers' будет работать отлично. –
ok Спасибо, я попытаюсь изменить код и вернуться к вам, если у вас возникнут проблемы, если вы не возражаете, однако, плохо отмечайте свой ответ как правильный, поскольку вы вкладываете время и силы, чтобы помочь мне, оценили, спасибо. – Ronny