【发布时间】:2010-07-15 18:49:07
【问题描述】:
我有一个 STL 容器,我需要对容器中的每个元素执行一个操作。但是,如果对任何元素的操作失败,我想对已更改的任何元素撤消操作。
例如,如果我有一个带有指向数字 bankAccount 类的指针的 STL 向量,并且想要将每个类增加 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
-
是否可以循环遍历,只检查操作是否成功?然后,您只需确保它们都会成功,如果成功,请执行操作。
-
您应该捕获您期望可能引发的特定异常。如果您有一个
catch (...)块,您将无法知道引发了什么异常,并且离开此类 catch 块的唯一合理方法是重新引发异常或终止应用程序。