VC++2010 の bool 値の動きが、false -> true -> true なのだから、それに合わせてデクリメントを作ってみる。
class BOOL { bool _b ; // 内部でブール値を持つwww public: BOOL( bool b = false ) { _b = b; } // bool型へキャスト operator bool() { return _b ; } // bool型から代入 BOOL& operator =( bool b ) { _b = b; return *this; } // 前置インクリメント BOOL& operator ++() { _b = true; return *this; } // 後置インクリメント BOOL operator ++(int) { BOOL b; b._b = _b; _b = true; return b; } // 前置デクリメント BOOL& operator --() { _b = false; return *this; } // 後置デクリメント BOOL operator --(int) { BOOL b; b._b = _b; _b = false; return b; } };
内部的に、bool 値を持っているのは GAG というかなんというか、意外と詰まらないコードになってしまいました。
最初は b |= 1; b &= 0; なことをやるつもりだったのですが、実は 0/1 しか値を取らないのだから、直接 false/ture を入れてしまえば良いわけです。
■結果
// デクリメントが可能なbool値 BOOL bl = false; cout << ++bl << endl; cout << --bl << endl;