boost開始w

for_eachでfunctorの使い方を覚えた矢先に厄介な問題に遭遇。
リファレンス受け取りのメンバ関数をmem_funに渡すとコンパイルできないというもの。

#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>

struct ReferenceData
{
  ReferenceData(int _num) : num(_num){};
  int num;
};

class Functor
{
  public:
    Functor()
    : m_sum(0)
    {
    };

    // ここのリファレンス渡しがだめ
    void operator()(const ReferenceData &data){
      m_sum+=data.num;
    }

    int get(){ return m_sum; };
  private:
    int m_sum;
};

int main(void)
{
  std::vector<ReferenceData> values;
  for(int i=0; i<10; i++){
    values.push_back(i);
  };

  Functor func;

  std::for_each(values.begin(), values.end(),
    std::bind1st(
      std::mem_fun(&Functor::operator()), &func));
  std::cout << func.get() << std::endl; // OK

  return 0;
}

これをコンパイルしようとすると下記のものを含むエラーが出る(gcc)。

forming reference to reference type `const ReferenceData&'

どうしても埒が明かないのでネットで検索したら既知の問題らしく素のSTLでは実際にコンパイルできないらしい。
http://0xcc.net/blog/archives/000090.html

しかし、ここでそれを改良したBoostのmem_fnというがあるらしいと知る。
・・・
Boostは意図的に敬遠していたのだがこれを機に手を出すことにした。
手を広げすぎだっぜ。
すでに手を広げすぎでてわりと収拾がつかない状態なのに、
AdobeのGIL, IntelのTBB, BoostのLambdaとか面白そうな素材がありすぎて困ってしまう。