如果我已经定义了operator >和operator <(以及operator ==),我是否需要定义operator >=和operator <=,或者如果我有意不声明它们,编译器会为我自动声明它们吗?
另外,如果我定义了operator ==,编译器会为我声明operator !=吗?
另外,如果我定义了operator ==,编译器会为我声明operator !=吗?
template< typename DerivedType >
class ComparisonOperators
{
public:
friend bool operator!=(
DerivedType const& lhs,
DerivedType const& rhs )
{
return !(lhs == rhs);
}
friend bool operator<=(
DerivedType const& lhs,
DerivedType const& rhs )
{
return !(rhs < lhs);
}
friend bool operator>(
DerivedType const& lhs,
DerivedType const& rhs )
{
return rhs < lhs;
}
friend bool operator>=(
DerivedType const& lhs,
DerivedType const& rhs )
{
return !(lhs < rhs);
}
protected:
~ComparisonOperators() {}
} ;
<
和==
,并从此派生,你将获得所有运算符:class MyClass : public ComparisonOperators<MyClass>
{
// ...
public:
bool operator==( MyClass const& other ) const;
bool operator<( MyClass const& other ) const;
// ...
};
请注意:我手动简化了我实际使用的版本,它定义了==
和<
,查找成员函数compare
和isEqual
,并在没有isEqual
时使用compare
进行==
和!=
比较。我认为我没有引入任何错误,但是你永远不知道。
int compare(DerivedType const &o)
,它返回负数、正数或0值(传统的C方法)。通常==
和<
的代码非常相似,因此将它们合并在一起很好。 - edA-qa mort-ora-y这里已经有一些使用boost
和继承的好答案了。但正如某人所指出的 - 使用继承来创建运算符似乎是错误的。
我知道在C++中,#define
是“禁忌”的,但在这里我仍然使用它。
我在我的通用实用程序包含文件中有一个#define
,它像这样:
#define CREATE_COMPARITORS(name) \
inline bool operator>(const name &o){return o<*this;} \
inline bool operator<=(const name &o){return not (o<*this);} \
inline bool operator>=(const name &o){return not (*this<o);} \
inline bool operator!=(const name &o){return not (*this==o);}
那么如果我有一个类,我只需要声明 operator<
和 operator==
:
class ttt{
//...
bool operator<(const ttt &o);
bool operator==(const ttt &o);
CREATE_COMPARITORS(ttt);
//...
};
Boost
及其处理方式的人之一,而你恰好是另一群喜欢Boost
的人之一,就给我投反对票,那你就是滥用你的权力。 - rabensky
operator<
和operator==
,你可以引入std::rel_ops
命名空间来提供其他的运算符,但这并不是一个真正的好的解决方案。Boost.Operators才是正确的做法。 - Praetorian