У меня есть контейнер STL, и мне нужно выполнить действие для каждого элемента в контейнере. Но если действие не выполняется для любого элемента, я хочу изменить действие на любые элементы, которые уже были изменены.Идите вперед, а затем переверните контейнер STL
Например, если у меня был вектор STL с указателями на числовые классы bankAccount и вы хотели увеличить их на 50 долларов. Но если какой-либо из банковских счетов не увеличится на 50, я хочу полностью отменить увеличение и уменьшить на 50 долларов любую из уже увеличенных учетных записей.
std::vector<bankAccount*> bankAccounts;
std::vector<bankAccount*>::iterator iter;
for (iter = bankAccounts.begin(); iter != bankAccounts.end(); ++iter)
{
try
{
iter->increaseBalance(50);
}
catch (...)
{
// One of the bankAccounts failed to increase by 50, now I need to go
// back and decrease by 50 all of the bankAccounts that have already
// been increased.
}
}
Есть ли элегантный способ сделать это? Может быть, с алгоритмами STL или с использованием обратных итераторов?
напишите * functor * и используйте * for_each * –
Возможно ли выполнить цикл и просто проверить, будет ли операция успешной? Затем вы просто убедитесь, что все будут успешными, и если да, выполните действие. – GManNickG
Вы должны поймать конкретное исключение, которое, как вы ожидаете, может быть выброшено. Если у вас есть блок 'catch (...)', вы не можете знать, какое исключение было выбрано, и единственные разумные способы оставить такой блокирующий блок - либо перестроить исключение, либо прекратить действие приложения. –