Я создаю диспетчер ввода, который хранит события и связанные с ним методы (std::function<void()>
) для вызова при возникновении события. Однако при вызове события может быть несколько событий. Очевидным способом хранения обработки событий будет linked list
, но поскольку это может быть несколько функций, это не сработает. Я думаю, что у меня есть linked list
, в котором хранятся массивы std::function<void()>
в качестве элементов. Является ли это подходящим методом для использования, а если не самым безопасным подходом?Связанный список с несколькими элементами данных на ключ
ответ
Храните свое отображение Event-> Function в multimap
, которое может хранить комбинации клавиш/значений с дублирующими ключами.
std::multimap<Event, std::function<void()>> events_;
Когда событие срабатывает, вы можете найти список всех обработчиков событий с помощью equal_range
, который возвращает std::pair
итераторов всех функций обработки событий. Вызовите каждое из них для обработки события, например. (Непроверенный код)
void on_event(Event const &e) {
for (auto r = events_.equal_range(e); r.first != r.second; ++r.first)
r.first->second();
}
equal_range
возвращает пару итераторов, так что цикл между ними. На каждой итерации цикла итератор (r.first) указывает пару ключ/значение. r.first->first
будет e
и r.first->second
будет обработчиком функции.
Спасибо, полностью отвечает на вопрос, и спасибо за то, что он показал мне, как получить все обработчики событий. – w4etwetewtwet
Если в нем хранятся события и функции, почему бы и нет карты? Для нескольких функций - мультимап. – chris
@chris Спасибо, звучит так, как я хочу. Я не очень хорошо знаю, какие структуры данных предварительно создаются на C++, так что это отличная помощь! – w4etwetewtwet
@handuel, http://stackoverflow.com/a/471461/962089 – chris