也許我是在想這一點,但考慮下面的例子: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);' –