いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

メンバテンプレート関数ポインタ と boost::bind

タイトルの項目で苦戦してました。^^; 以下実験結果。
class A
{
public:
  template<typename T>
  void Func(T& fnBinFunc);
};

class BinFunc; // operator() が定義されている

vector<A*> stlList; // 適当に内容挿入

こんなのがあった時、A::Func を for_each で呼び出したかったのです。これが上手くいかず試行錯誤していました。

for_each(stlList.begin(), stlList.end(),
  bind2nd(mem_fun(&A::Func), BinFunc()));

for_each(stlList.begin(), stlList.end(),
  boost::bind(&A::Func, _1, BinFunc()));

当初は単純に上記のように書いていたのですが、これでは大量のエラーが報告されてしまいます。

メンバテンプレート関数は for_each で呼び出せないのかっ…? と思ったんですが、実は呼び出せました

for_each(stlList.begin(), stlList.end(),
  boost::bind<void, A, BinFunc&>(&A::Func<BinFunc>, _1, BinFunc()));

こんな感じで。 boost::bind() にも明示的な型指定が必要だったとは……うむむ〜ん。(ちなみに、STL Onlyでやる場合ってのは、よくわからず…)


boost 入門者の私にはコレを導き出すのに一杯一杯でしたが、実はもっと楽な方法とかあったりするんでしょーかねぇ…。
>ツッコミよろしくです^^;