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

Jam*_*rey 6 c++ operator-overloading operators

如果我已经有operator>operator < defined(和operator ==),我是否需要定义operator> =operator <=,或者如果我故意不声明它们,编译器是否会为它声明它们?

另外,如果我有operator == defined,编译器会为我声明operator!=吗?

Arn*_*rtz 6

不,编译器不会声明/定义您未手动定义的任何运算符.但是,Boost.Operators可能是您喜欢的 - 它完全符合您希望编译器执行的操作.


Jam*_*nze 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() {}
} ;
Run Code Online (Sandbox Code Playgroud)

定义<==在您的课程中,并从中派生出来,您将获得所有运算符:

class MyClass : public ComparisonOperators<MyClass>
{
    //  ...
public:
    bool operator==( MyClass const& other ) const;
    bool operator<( MyClass const& other ) const;
    //  ...
};
Run Code Online (Sandbox Code Playgroud)

只是注意:我手动简化版本,我实际使用中,它定义==<为好,查找成员函数compareisEqual,并且使用compare==!=当没有isEqual.我不认为我引入了任何错误,但你永远不会知道.

  • 这不就是Boost.Operators已经为你做的吗?;-) (3认同)