2006年11月26日

boost::bind

boostのbindを使った感想とサンプルコードを書きます。

以下ような、整数値を一つ格納できるItemというクラスと、Itemクラスへのポインタ(boost::shared_ptr)を要素としたItemList型、そしてItemList型のオブジェクトItemsがあったとします。

class Item
{
public:
  int GetValue(void) const
  {
    return Value_;
  }
private:
  int Value_;
};

typedef std::list<boost::shared_ptr<Item> > ItemList;
ItemList Items;

Itemsに格納されているItemオブジェクトのうち、GetValue()で取得できる値が10となっているItemオブジェクトのイテレータを取得するコードは、次のように書けます。

ItemList::iterator s = Items.begin();
for (ItemList::iterator e = Items.end(); s != e; ++s) {
  if ((*s)->GetValue() == 10) {
    break;
  }
}

このループは、boost::bindを使うと以下のように1行になります。

ItemList::iterator s = std::find_if(Items.begin(), Items.end(), boost::bind(std::equal_to<int>(), boost::bind(&Item::GetValue, _1), 10));

boost::bindすげぇ。templateマジックです。素晴しいです。
boost::bindをもっと使いこなせば、かなりの処理を一行で書いてしまえそうです。

しかし、boost::bindを使いすぎると分かり難いコードになりそうです。メンテナンスの容易さが問われるときは、分かり易いfor文を使うことを検討してみるのも良さそうです。

(2006/11/27) このコードはboost::lambdaによりもう少し見やすくなります。詳しくは続きで。

投稿者 MASATO : 2006年11月26日 08:07 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?