現在の問題に一連のビットフラグを使用しようとしています。これらのフラグは (うまく) の一部として定義されていますが、列挙型から 2 つの値を取得すると、操作の戻り値の型が type にenum
なることを理解しています。OR
OR
int
私が現在探しているのは、ビットマスクのユーザーがタイプセーフを維持できるようにするソリューションです。そのため、次のオーバーロードを作成しましたoperator |
enum ENUM
{
ONE = 0x01,
TWO = 0x02,
THREE = 0x04,
FOUR = 0x08,
FIVE = 0x10,
SIX = 0x20
};
ENUM operator | ( ENUM lhs, ENUM rhs )
{
// Cast to int first otherwise we'll just end up recursing
return static_cast< ENUM >( static_cast< int >( lhs ) | static_cast< int >( rhs ) );
}
void enumTest( ENUM v )
{
}
int main( int argc, char **argv )
{
// Valid calls to enumTest
enumTest( ONE | TWO | FIVE );
enumTest( TWO | THREE | FOUR | FIVE );
enumTest( ONE | TWO | THREE | FOUR | FIVE | SIX );
return 0;
}
このオーバーロードは本当にタイプ セーフを提供しますか? 列挙型で定義されていない値を含むものをキャストするint
と、未定義の動作が発生しますか? 注意事項はありますか?