VC++2010 の bool 値の動きが、false -> true -> true なのだから、それに合わせてデクリメントを作ってみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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 を入れてしまえば良いわけです。
■結果
1 2 3 4 | // デクリメントが可能なbool値 BOOL bl = false ; cout << ++bl << endl; cout << --bl << endl; |