多くの場合、次のタスクを達成するために必要です: 何かの状態を変更し、アクションを実行してから、状態を元に戻します。たとえば、Win32 GDI では、背景色を変更し、描画を行ってから色を元に戻す必要があります。
直接行うことができます:
COLORREF oldColor = SetBkColor( deviceContext, newColor );
drawStuff( deviceContext );
SetBkColor( deviceContext, oldColor );
または、コンストラクターで前方変更を行い、デストラクタで後方変更を行うブラケット クラスを介して:
CBkColorSwitcher switcher( deviceContext, newColor );
drawStuff( deviceContext );
//once control reaches end of block the switcher is destroyed and the change is reverted
ブラケット クラスの利点は明らかです。変更の間に例外がスローされた場合、変更は正しく元に戻されます。短所は何ですか?