サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <boost/operators.hpp>
class Integer
: private boost::operators<Integer>
{
public:
Integer( int n = 0 ) : val_( n ) {}
bool operator<(const Integer& x) const { return val_ < x.val_; }
bool operator==(const Integer& x) const { return val_ == x.val_; }
Integer& operator+=(const Integer& x) { val_+=x.val_; return *this; }
Integer& operator-=(const Integer& x) { val_-=x.val_; return *this; }
Integer& operator*=(const Integer& x) { val_*=x.val_; return *this; }
Integer& operator/=(const Integer& x) { val_/=x.val_; return *this; }
Integer& operator%=(const Integer& x) { val_%=x.val_; return *this; }
Integer& operator|=(const Integer& x) { val_|=x.val_; return *this; }
Integer& operator&=(const Integer& x) { val_&=x.val_; return *this; }
Integer& operator^=(const Integer& x) { val_^=x.val_; return *this; }
Integer& operator++() { ++val_; return *this; }
Integer& operator--() { --val_; return *this; }
private:
int val_;
};
int main()
{
Integer i = 200;
Integer j = 100;
Integer k = (i + j) * (j - i) % (i / 50);
k++;
return 0;
}
特別な理由がなければ、a > b
と b < a
は同じ意味にすることが多いと思います。要するに、operator<
を定義してしまえば即 operator>
の定義も決まると言うこと。
operator==
と operator!=
、あるいはこれらと
operator<=
、operator>=
の関係も同じですね。
こういうのを、最低限の演算子だけは定義してから残りを boost::operators
に任せることで、自動的に生成することができます。
後置の++から前置の++を作るとか、operator+=
から operator+
を作るなども同じ伝で。
上の例で用いた operators<>
テンプレートのように全部の演算子を片っ端から生成するのではなく、
細かく指定して処理させることも可能。