我应该在 class 中实施哪些运算符?
Which operators should I implement in my class?
我已经创建了自己的 class,如下所示:
template<class T>
class ball
{
T size;
T price;
};
现在我想支持仅根据第一个值 size
比较两个球,在这种情况下,我是否应该为 ball
class 实现所有这些运算符??
==, !=, >=, <=, >, <
这听起来效率不高或不正确。
Which operators should I implement in my class?
一般来说,您至少应该实现您使用的那些运算符。以及您需要 class 来实现的概念所要求的那些。
如果你想让class相等可比较,那么理想的设计是让class也可以使用operator!=
进行比较,如果你想让class与有序关系可比,那么理想的设计是让class与所有运算符可比。
should I implement all those operators for ball class??
C++20 之前的版本:是的,如果您希望 class 具有可比性,这是个好主意。
自 C++20 起:不,在大多数情况下您应该只实现 operator<=>
。最好默认。
I want to support comparing two balls only according to the first value size
我建议不要将比较运算符定义为这种行为。这会让 class 的用户非常困惑,因为他们可能会期望价格会影响对象的相等性。
如果您需要针对特定用例进行这种比较,那么我建议改用自定义比较对象。
另一种解决方案是实现一种支持所有情况的方法。一个优点是您可以在运行时动态选择测试:
// in .hpp
typedef enum { Equal, LessOrEqual, GreaterOrEqual, NotEqual, GreaterThan, LessThan } Comparator;
bool compare(ball & a, ball & b, Comparator c = Equal);
// in .cpp
bool compare(ball & a, ball & b, Comparator c) {
bool r;
switch(c) {
case GreaterOrEqual: case LessThan: r = a.size >= b.size; break;
case LessOrEqual: case GreaterThan: r = a.size <= b.size; break;
default: r = a.size == b.size; break;
}
return c >= NotEqual ? !r : r;
}
我已经创建了自己的 class,如下所示:
template<class T>
class ball
{
T size;
T price;
};
现在我想支持仅根据第一个值 size
比较两个球,在这种情况下,我是否应该为 ball
class 实现所有这些运算符??
==, !=, >=, <=, >, <
这听起来效率不高或不正确。
Which operators should I implement in my class?
一般来说,您至少应该实现您使用的那些运算符。以及您需要 class 来实现的概念所要求的那些。
如果你想让class相等可比较,那么理想的设计是让class也可以使用operator!=
进行比较,如果你想让class与有序关系可比,那么理想的设计是让class与所有运算符可比。
should I implement all those operators for ball class??
C++20 之前的版本:是的,如果您希望 class 具有可比性,这是个好主意。
自 C++20 起:不,在大多数情况下您应该只实现 operator<=>
。最好默认。
I want to support comparing two balls only according to the first value size
我建议不要将比较运算符定义为这种行为。这会让 class 的用户非常困惑,因为他们可能会期望价格会影响对象的相等性。
如果您需要针对特定用例进行这种比较,那么我建议改用自定义比较对象。
另一种解决方案是实现一种支持所有情况的方法。一个优点是您可以在运行时动态选择测试:
// in .hpp
typedef enum { Equal, LessOrEqual, GreaterOrEqual, NotEqual, GreaterThan, LessThan } Comparator;
bool compare(ball & a, ball & b, Comparator c = Equal);
// in .cpp
bool compare(ball & a, ball & b, Comparator c) {
bool r;
switch(c) {
case GreaterOrEqual: case LessThan: r = a.size >= b.size; break;
case LessOrEqual: case GreaterThan: r = a.size <= b.size; break;
default: r = a.size == b.size; break;
}
return c >= NotEqual ? !r : r;
}