boost::operators

トップページ > 小道具 >

abstract

必要なヘッダ
<boost/operators.hpp>
出来ること
演算子を自動的に定義
リファレンス
en

sample

サンプルの動作確認バージョン [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;
}

etc

特別な理由がなければ、a > bb < a は同じ意味にすることが多いと思います。要するに、operator< を定義してしまえば即 operator> の定義も決まると言うこと。 operator==operator!=、あるいはこれらと operator<=operator>= の関係も同じですね。 こういうのを、最低限の演算子だけは定義してから残りを boost::operators に任せることで、自動的に生成することができます。

後置の++から前置の++を作るとか、operator+= から operator+ を作るなども同じ伝で。 上の例で用いた operators<> テンプレートのように全部の演算子を片っ端から生成するのではなく、 細かく指定して処理させることも可能。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0