是否有一种通用的方法在C ++中保存堆栈上的状态变量?

时间:2013-05-10 13:49:35

标签: c++ variables state

在我目前正在处理的程序中,许多对象包括与对象持久存在的状态变量。例如表示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();
}

有没有更好的方法来执行此操作,或者是将变量推送到堆栈的公认方法?

2 个答案:

答案 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();
}