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