4

私が現在取り組んでいるプログラムでは、多くのオブジェクトに、オブジェクトと共に持続する状態変数が含まれています。たとえば、3D モデルのポイントを表すオブジェクトには、そのポイントが編集用に選択されているかどうかを制御する変数が含まれる場合があります。非常に定期的に、これらの状態変数の 1 つ以上がコードによって一時的に変更されます。

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

これを行うためのより良い方法、または変数をスタックにプッシュする広く受け入れられている方法はありますか?

4

2 に答える 2

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();
}
于 2013-05-10T14:53:18.307 に答える