我有一组看起来像这样的类型:
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 给出的“值类型”的定义,但我也认为这是一种奇怪或不熟悉(但在我的情况下很有用)的模式。
所以我的问题是:这个......概念有概念名称吗?
这种类型有什么用?我在“黑板”事件系统中使用这种类型,它基本上是一种具有至少常规类型的任何值的集合。但是,即使已经找到(通过比较),这个黑板也会系统地覆盖推送(插入)其中的值。这样,我使用比较运算符作为标识符覆盖黑板上值的完整状态。
我不知道这是否是众所周知的模式或想法,或者从长远来看是否存在问题。到目前为止,它非常有用。它也感觉像是“太聪明”的东西,但我缺乏这种模式的经验来证实这一点。可能是我滥用比较运算符的使用,但感觉这些类型的语义在我的使用中是正确的。
如有必要,我可以提供一个详细的使用示例。