我目前有一个类似的结构
struct foo
{
UINT64 optionA = 0;
UINT64 optionB = 0;
UINT64 optionC = 0;
}
我试图在optionA
、optionB
和optionC
的基础上编写一个用于比较foo
的两个对象的函数。从本质上讲,我希望函数检查optionA
在两者中是否相同。如果否,则返回最低的对象。如果两个对象中的optionA
相同,则它将检查两个对象的optionB
,并返回最低的一个。如果optionB
在两者中相同,则它将查看optionC
并返回最低值。
我认为这可以通过为每个对象分配一个UINT64 no来实现。然后根据优先级将比特分配给no,然后比较每个比特并返回较小的一个。我不知道如何采取这种方法,任何这样做的建议都将不胜感激。
对于C++20,默认的operator <=>
和operator ==
可以完成这项工作。
struct foo
{
UINT64 optionA = 0;
UINT64 optionB = 0;
UINT64 optionC = 0;
auto operator <=>(const foo&) const = default;
bool operator ==(const foo&) const = default;
};
否则,std::tuple
可能会有所帮助:
bool operator ==(const foo& lhs, const foo& rhs)
{
return std::tie(lhs.optionA, lhs.optionB, lhs.optionC)
== std::tie(rhs.optionA, rhs.optionB, rhs.optionC);
}
bool operator <(const foo& lhs, const foo& rhs)
{
return std::tie(lhs.optionA, lhs.optionB, lhs.optionC)
< std::tie(rhs.optionA, rhs.optionB, rhs.optionC);
}
如果有一个直接按正确顺序比较数据成员的比较函数,会更简单、更可读,但如果有存储哪些数据成员更大的位掩码出于其他原因有帮助,那么我将如何做到这一点:
foo compare(foo x, foo y)
{
// needs to hold status for 3 data members (one bit each)
int x_status = 0, y_status = 0;
// each bit is 1 if this member is bigger, 0 if smaller
x_status |= (x.optionC > y.optionC)<<0;
x_status |= (x.optionB > y.optionB)<<1;
x_status |= (x.optionA > y.optionA)<<2;
// each bit is 1 if this member is bigger, 0 if smaller
y_status |= (x.optionC < y.optionC)<<0;
y_status |= (x.optionB < y.optionB)<<1;
y_status |= (x.optionA < y.optionA)<<2;
// so now we can compare the values
// if all the data members were bigger the value will be 7 (0b111)
// if all the data members were smaller the value will be 0 (0b000)
if (x_status < y_status) return x; else return y;
}
请在此处在线试用:https://onlinegdb.com/XpdOSFLFa
代码当前缺少一个检查相等性的运算符。
示例:
constexpr bool operator==(const foo& a, const foo& b) {
return
a.optionA == b.optionA &&
a.optionB == b.optionB &&
a.optionC == b.optionC;
}
有了它,下面的代码就会编译(有意义的(:
using UINT64 = /* unsigned long long */; // usually
struct foo {
UINT64 optionA = 0;
UINT64 optionB = 0;
UINT64 optionC = 0;
};
constexpr bool operator==(const foo& a, const foo& b) {
return
a.optionA == b.optionA &&
a.optionB == b.optionB &&
a.optionC == b.optionC;
}
int main() {
constexpr foo a, b;
static_assert(a == b);
}