我讨论 Exception Safety Guaratees ,并设计了一个我认为提供强保证的例子:
template<typename E, typename LT>
void strongSort(vector<E*> &data, LT lt) // works on pointers
{
vector<E*> temp { data }; // bad_alloc? but 'data' not changed.
sort(temp.begin(), temp.end(), lt); // 'lt' might throw!
swap(temp, data); // considered safe.
}
一个简单的(C ++ 0x) - 示例如何使用它:
int main() {
vector<int*> data { new int(3), new int(7), new int(2), new int(5) };
strongSort( data, [](int *a, int *b){ return *a<*b;} );
for(auto e : data) cout << *e << " ";
}
假设LT
没有改变元素,但它可能会抛出。假设代码提供
LT
答案 0 :(得分:1)
是。强异常保证意味着操作成功完成或保持数据不变。
异常中立意味着您允许异常传播。
答案 1 :(得分:0)
这是例外安全。为了更安全,为什么不使用vector<shared_ptr<int>>
template<typename Type, typename Func>
void StrongSort( vector<shared_ptr<Type>>& elems, Func fun)
{
vector<shared_ptr<Type>> temp ( elems.begin(), elems.end());
sort(temp.begin(), temp.end(), fun);
swap(elems, temp);
}
vector<shared_ptr<int>> ints;
ints.push_back(shared_ptr<int>(new int(3)));
ints.push_back(shared_ptr<int>(new int(1)));
ints.push_back(shared_ptr<int>(new int(2)));
StrongSort(ints, [](shared_ptr<int> x, shared_ptr<int> y) -> bool { return *x < *y; });