6

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

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

4

3 回答 3

6

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

于 2013-07-23T17:56:00.530 回答
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() {}
} ;

在您的类中定义<and==并从中派生,您将获得所有运算符:

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

请注意:我已经手动简化了我实际使用的版本,它定义了and ==<查找成员函数compareand isEqual,并 在没有. 我认为我没有引入任何错误,但你永远不会知道。compare==!=isEqual

于 2013-07-23T18:12:00.010 回答
0

这里已经有一些使用boost和继承的好答案。但正如有人指出的那样 - 使用继承来创建运算符似乎......错误。

我知道#defines 在 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);
  //...
};
于 2013-07-23T19:24:58.723 回答