整数値をキャストするとゼロなら偽、それ以外なら真になる。
でもそんなとき #define TRUE (1) なんかと比較するとゼロでない何らかの数値は
"1"とは限らないので具合が悪い。なので偽を表す定数としか比較できないように
したい。
…というような要件の解決を試みるコード。
#include <boost/static_assert.hpp> // nil かそれ以外の状態を持つ型 enum flag_t { nil = 0 }; // 以下のオペレーターは実装されない bool operator ==( flag_t, bool ); bool operator ==( flag_t, int ); bool operator ==( flag_t, float ); bool operator !=( flag_t, bool ); bool operator !=( flag_t, int ); bool operator !=( flag_t, float ); bool operator ==( bool , flag_t ); bool operator ==( int , flag_t ); bool operator ==( float, flag_t ); bool operator !=( bool , flag_t ); bool operator !=( int , flag_t ); bool operator !=( float, flag_t ); // enum のサイズって int と同じだっけ? BOOST_STATIC_ASSERT( sizeof( flag_t ) >= sizeof( bool ) ); BOOST_STATIC_ASSERT( sizeof( flag_t ) >= sizeof( int ) ); BOOST_STATIC_ASSERT( sizeof( flag_t ) >= sizeof( float ) );
void func() { const flag_t flg = someFunc(); // 真なら通る条件文 if ( flg ) { /* ... */ } // 偽なら通る条件文 if ( flg == nil ) { /* ... */ } // 以下はリンカエラーを起こす if ( flg == false ) { /* ... */ } if ( flg == 12345 ) { /* ... */ } if ( flg == 1.23f ) { /* ... */ } }