我是否需要手动声明> =和< =运算符?

时间:2013-07-23 17:53:31

标签: c++ operators operator-overloading

如果我已经定义运算符> 运算符< (以及运算符== ),我是否需要定义运算符> = 运算符< = ,或者如果我故意不声明它们,编译器会为我声明它们吗?

另外,如果我定义了 operator == ,编译器是否会为我声明 operator!=

3 个答案:

答案 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;
    //  ...
};

请注意:我手动简化了我实际使用的版本, 定义==<的人也会查找该成员 函数compareisEqualcompare使用== 当没有!=时,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);
  //...
};