也许我是在想这一点,但考虑下面的例子:RAII对象恢复以前的值
bool some_state = false;
// ... later ...
some_state = true;
do_something();
some_state = false;
现在想象一下,do_something()
可以抛出。我们不会将some_state
设置回false
。什么是好的是有某种是推动基于余地记住以前的值/自动弹出堆栈:
{
scoped_restore res(some_state, true); // This sets some_state to true and remembers previous value (false)
do_something();
} // At this point, res is destroyed and sets some_state back to false (previous value)
确实提升有这样的事?我当然可以写自己的对象,但是我想确保我不会首先重新发明轮子。我在MSVC上使用C++ 03,所以我不能使用任何奇特的新的C++ 11:(
它,而不是语言本身更编码风格的问题。只需使用'try/catch' ... – billz
@billz try/catch用于异常处理,不是正常的,预期的逻辑。投掷也有性能影响。不可接受的解决方案。 RAII不是一种编码风格偏好,它是一种设计模式。 –
还有[Boost.ScopeExit](http://www.boost.org/doc/libs/1_39_0/libs/scope_exit/doc/html/index.html),但我不确定是否适合。用法:'BOOST_SCOPE_EXIT(some_state = true);' –