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 | トラックバック