Я не смог найти пример того, как это сделать, поэтому я надеялся, что кто-то может мне помочь вне. У меня есть карта, определенная в классе следующим образом:
std::map<std::string, TranslationFinished> translationEvents;
TranslationFinished - это boost :: function. У меня есть метод как часть моего класса, который выполняет итерацию по этой карте, вызывая каждую из функций следующим образом:
void BaseSprite::DispatchTranslationEvents()
{
for(auto it = translationEvents.begin(); it != translationEvents.end(); ++it)
{
it->second(this);
}
}
Однако функция, вызываемая it-> second (this);
, может удалить элемент из карты translationEvents (обычно сам) с помощью следующей функции:
bool BaseSprite::RemoveTranslationEvent(const std::string &index)
{
bool removed = false;
auto it = translationEvents.find(index);
if (it != translationEvents.end())
{
translationEvents.erase(it);
removed = true;
}
return removed;
}
выполнение этого приводит к сбою утверждения отладки, когда DispatchTranslationEvents ()
пытается увеличить итератор. Есть ли способ безопасно выполнить итерацию по карте с возможностью того, что вызов функции во время итерации может удалить элемент с карты?
Заранее спасибо
РЕДАКТИРОВАТЬ: случайно C / Pd неправильный код удаления события. Сейчас исправлено.