如果我已经定义了operator >和operator <(和operator ==),我是否需要定义operator >=和operator <=,或者如果我故意不声明它们,编译器会为我声明它们吗?
另外,如果我定义了operator ==,编译器会为我声明operator !=吗?
如果我已经定义了operator >和operator <(和operator ==),我是否需要定义operator >=和operator <=,或者如果我故意不声明它们,编译器会为我声明它们吗?
另外,如果我定义了operator ==,编译器会为我声明operator !=吗?
不,编译器不会声明/定义您没有手动定义的任何运算符。但是,Boost.Operators 可能符合您的喜好 - 它完全按照您希望编译器执行的操作。
编译器不会在这里为您做任何事情,但是通过从适当的类继承来自动生成相对简单,例如:
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() {}
} ;
在您的类中定义<
and==
并从中派生,您将获得所有运算符:
class MyClass : public ComparisonOperators<MyClass>
{
// ...
public:
bool operator==( MyClass const& other ) const;
bool operator<( MyClass const& other ) const;
// ...
};
请注意:我已经手动简化了我实际使用的版本,它定义了and ==
,<
查找成员函数compare
and isEqual
,并
在没有. 我认为我没有引入任何错误,但你永远不会知道。compare
==
!=
isEqual
这里已经有一些使用boost
和继承的好答案。但正如有人指出的那样 - 使用继承来创建运算符似乎......错误。
我知道#define
s 在 C++ 中是“禁忌”,但这仍然是我在这里使用的。
我的#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<
and operator==
:
class ttt{
//...
bool operator<(const ttt &o);
bool operator==(const ttt &o);
CREATE_COMPARITORS(ttt);
//...
};