Я повторяю набор функций обратного вызова. Функции вызываются во время итерации и могут привести к радикальным изменениям в фактическом контейнере набора функций.
Сейчас я делаю следующее:
Проверка существования каждого элемента супер- динамичный, но тоже кажется довольно медленным.
Есть ли другие предложения по решению этого дела?
Изменить: вот фактический код:
// => i = event id
template <class Param>
void dispatchEvent(int i, Param param) {
EventReceiverSet processingNow;
const EventReceiverSet& eventReceiverSet = eventReceiverSets[i];
std::copy(eventReceiverSet.begin(), eventReceiverSet.end(), std::inserter(processingNow, processingNow.begin()));
while (!processingNow.empty()) {
EventReceiverSet::iterator it = processingNow.begin();
IFunction<>* function = it->getIFunction(); /// get function before removing iterator
processingNow.erase(it);
// is EventReceiver still valid? (may have been removed from original set)
if (eventReceiverSet.find(ERWrapper(function)) == eventReceiverSet.end()) continue; // not found
function->call(param);
}
};