如果我已经定义运算符> 和运算符< (以及运算符== ),我是否需要定义运算符> = 和运算符< = ,或者如果我故意不声明它们,编译器会为我声明它们吗?
另外,如果我定义了 operator == ,编译器是否会为我声明 operator!= ?
答案 0 :(得分:6)
不,编译器不会声明/定义您未手动定义的任何运算符。但是,Boost.Operators可能是您喜欢的 - 它完全符合您希望编译器执行的操作。
答案 1 :(得分:5)
编译器在这里不会为你做任何事情,但它是 通过继承自动生成相对简单 适当的类,如:
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
,compare
使用==
当没有!=
时,isEqual
。我不认为我是
介绍了任何错误,但你永远不知道。
答案 2 :(得分:0)
这里使用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);
//...
};