RAIIスタイルのC++クラスがあるとします。
class StateSaver
{
public:
StateSaver(int i) { saveState(); }
~StateSaver() { restoreState(); }
};
...私のコードでそのように使用されます:
void Manipulate()
{
StateSaver save(1);
// ...do stuff that modifies state
}
...目標は、ある状態に入り、何かを行い、そのスコープを離れるときにその状態を離れることです。このタイプミスをコンパイルしないようにする方法はありますか(または警告するか、間違いに気付くことができるように何らかの形で文句を言う)?
void Manipulate()
{
StateSaver(1); // ruh-roh, state saved and immediately restored!
// ...do stuff that modifies state
}
これを防ぐために使用できるC++自体の内容はわかりませんが、それが存在しないという意味ではありません。C ++に何もない場合は、コンパイラ固有の拡張機能を使用できます。私は主にgccとmsvcをターゲットにするものに興味があります(いつかicc、他のコンパイラのアイデアは歓迎されますが、役に立つ可能性は低いです)ので、それらのいずれかをハックすると便利です(もちろん、適切に#ifdefされたマクロ定義に抽象化されます) 。