処理を行っている間だけフラグを立てたいときなどがあります。コードを書くならこんな感じです。
BOOL flag = FALSE;
{
flag = TRUE;
cout << "#1 " << flag << " -> ";
flag = FALSE;
}
cout << flag << endl;
結果
#1 1 -> 0
通常はこれで問題ないのですが例外をthrowされると期待通り動きません。
try
{
flag = TRUE;
cout << "#2 " << flag << " -> ";
throw runtime_error("");
flag = FALSE;
}
catch(runtime_error &e)
{
}
cout << flag << endl;
結果
#2 1 -> 1
こういうときは、クラスのデストラクタを利用するとうまくいきます。
class Foo
{
public:
Foo(std::function<void ()> func)
: m_func(func)
{
}
~Foo()
{
m_func();
}
private:
std::function<void ()> m_func;
};
try
{
flag = TRUE;
cout << "#3 " << flag << " -> ";
Foo foo([&]{flag = FALSE;});
throw runtime_error("");
}
catch(runtime_error &e)
{
}
cout << flag << endl;
結果
#3 1 -> 0
STLなど標準ライブラリにFooのようなクラスがないか調べてみたのですが見つかりませんでしたが、
shared_ptr のカスタムデリータを使えば同じ事ができました。
try
{
flag = TRUE;
cout << "#4 " << flag << " -> ";
shared_ptr<int> pObj(0, [&](int *){flag = FALSE;});
throw runtime_error("");
}
catch(runtime_error &e)
{
}
cout << flag << endl;
結果
#4 1 -> 0
他にも方法があれば教えて欲しいな。