【发布时间】:2013-07-23 23:37:01
【问题描述】:
也许我想多了,但请考虑以下示例:
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)
boost 有这样的东西吗?我当然可以编写自己的对象,但我想确保我不会先重新发明轮子。我在 MSVC 上使用 C++03,所以很遗憾我不能使用任何花哨的新 C++11 :(
【问题讨论】:
-
更多的是编码风格问题,而不是语言本身。只需使用
try/catch... -
@billz try/catch 用于异常处理,不是正常的预期逻辑。投掷也有性能影响。不是一个可接受的解决方案。 RAII 不是一种编码风格偏好,而是一种设计模式。
-
有Boost.ScopeExit,但我不确定这是否合适。用法:
BOOST_SCOPE_EXIT(some_state = true); -
是的,OP 只想要一个范围保护,而 ScopeExit 似乎是一个范围保护。
-
@Robert Dailey 1.37 5 岁...