次のようなタイプのセットがあります。
struct MyFlag
{
SomeId source_id; // INVALID_ID by default
SomeData data; // regular type
friend bool operator==( const MyFlag& a, const MyFlag& b ) { return a.source_id == b.source_id; }
friend bool operator<( const MyFlag& a, const MyFlag& b ) { return a.source_id < b.source_id; }
friend bool operator!=( const MyFlag& a, const MyFlag& b ) { return !(a == b); }
friend bool operator==( const SomeId& a, const MyFlag& b ) { return a == b.source_id; }
friend bool operator<( const SomeId& a, const MyFlag& b ) { return a < b.source_id; }
};
MyFlag flag_a { id, data_A };
MyFlag flag_b { id, data_B };
assert( flag_a == flag_b );
assert( flag_a.data != flag_b.data );
assert( flag_a == id );
assert( flag_b == id );
MyFlag flag = flag_b;
assert( flag == flag_a );
assert( flag == id );
assert( flag.data != flag_a.data );
const MyFlag flag_x ={ id_x, data_A };
flag = flag_X;
assert( flag != flag_a );
assert( flag.data == flag_a.data );
つまり、オブジェクトの状態の特定の部分のみが比較対象となります。この例では、MyFlag オブジェクトは ID を使用して他のオブジェクトと比較されますが、含まれる残りのデータは比較されません。
Sean Parent が「値の型」について与えた定義と一致すると思いますが、これは奇妙でなじみのない (しかし私の場合は役立つ) パターンだとも思います。
だから私の質問は:この...概念の概念名はありますか?
そのようなタイプはどのように役立ちますか?私はこの種の型を「ブラック ボード」イベント システムで使用します。これは基本的に、少なくとも規則的な型を持つ任意の値の一種のセットです。ただし、このブラック ボードは、プッシュされた (挿入された) 値が既に見つかっていても (比較によって) 体系的に上書きします。このようにして、比較演算子を識別子として使用して、ブラック ボードの値の完全な状態を上書きします。
それがよく知られたパターンやアイデアなのか、それとも長期的に問題があるのか はわかりません。これまでのところ、非常に役に立ちました。また、「頭が良すぎる」ようにも感じますが、それを確認するには、このパターンの経験が不足しています。比較演算子の使い方を悪用しているのかもしれませんが、これらの型のセマンティクスは私の使い方では正しいと感じています。
必要に応じて、詳細な使用例を提供できます。