在我目前正在处理的程序中,许多对象包括与对象持久存在的状态变量。例如表示3d模型中的点的对象可能包含一个变量,用于控制是否已选择该点进行编辑。很多时候,这些状态变量中的一个或多个将被一段代码暂时修改,例如
void MyFunc();
{
mytype temp = statevar;
statevar = newvalue;
DoSomething();
statevar = temp;
}
这有问题,好像DoSomething()
抛出异常,statevar
未正确恢复。我计划的解决方法是创建一个新的模板类来恢复其dtor中的值。像
template<class TYPE> class PushState
{
PushState(TYPE Var) { Temp = Var; }
Pop() { Var = Temp; }
~PushState() { Pop(); }
TYPE Temp;
}
void MyFunc();
{
PushState<mytype> Push(statevar);
DoSomething();
}
有没有更好的方法来执行此操作,或者是将变量推送到堆栈的公认方法?
答案 0 :(得分:3)
另一种选择是使用ad hoc RAII类。
例如:
void MyFunc();
{
class Finally {
mytype temp;
public:
Finally( ) { temp = statevar; }
~Finally() {
statevar = temp;
}
} finally;
statevar = newvalue;
DoSomething();
}
无论函数是正常返回还是抛出异常,当finally
超出范围时,都会自动调用析构函数。
答案 1 :(得分:2)
您可以使用Boost.ScopeExit。这将实例化一个对象,析构函数将执行范围退出代码。它只是隐藏了所有的样板代码。
#include <boost/scope_exit.hpp>
void MyFunc() {
mytype temp = statevar;
statevar = newvalue;
BOOST_SCOPE_EXIT(&statevar) {
statevar = temp;
} BOOST_SCOPE_EXIT_END
DoSomething();
}