2013-07-24 1 views
0

Я создаю диспетчер ввода, который хранит события и связанные с ним методы (std::function<void()>) для вызова при возникновении события. Однако при вызове события может быть несколько событий. Очевидным способом хранения обработки событий будет linked list, но поскольку это может быть несколько функций, это не сработает. Я думаю, что у меня есть linked list, в котором хранятся массивы std::function<void()> в качестве элементов. Является ли это подходящим методом для использования, а если не самым безопасным подходом?Связанный список с несколькими элементами данных на ключ

+1

Если в нем хранятся события и функции, почему бы и нет карты? Для нескольких функций - мультимап. – chris

+0

@chris Спасибо, звучит так, как я хочу. Я не очень хорошо знаю, какие структуры данных предварительно создаются на C++, так что это отличная помощь! – w4etwetewtwet

+0

@handuel, http://stackoverflow.com/a/471461/962089 – chris

ответ

1

Храните свое отображение 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 будет обработчиком функции.

+0

Спасибо, полностью отвечает на вопрос, и спасибо за то, что он показал мне, как получить все обработчики событий. – w4etwetewtwet

 Смежные вопросы

  • Нет связанных вопросов^_^