2009-06-15 7 views
15

次の例を検討してください。boost :: bindおよびクラスメンバー関数

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

#include <boost/bind.hpp> 

void 
func(int e, int x) { 
    std::cerr << "x is " << x << std::endl; 
    std::cerr << "e is " << e << std::endl; 
} 

struct foo { 
    std::vector<int> v; 

    void calc(int x) { 
     std::for_each(v.begin(), v.end(), 
      boost::bind(func, _1, x)); 
    } 

    void func2(int e, int x) { 
     std::cerr << "x is " << x << std::endl; 
     std::cerr << "e is " << e << std::endl; 
    } 

}; 

int 
main() 
{ 
    foo f; 

    f.v.push_back(1); 
    f.v.push_back(2); 
    f.v.push_back(3); 
    f.v.push_back(4); 

    f.calc(1); 

    return 0; 
} 

私はfunc()機能を使用する場合は、すべてが正常に動作します。しかし、実生活のアプリケーションでは、この例ではクラスメンバ関数、すなわちfoo::func2()を使用する必要があります。 boost :: bindでこれをどうすればできますか?

答えて

18

あなたは本当に、本当に接近していた:

void calc(int x) { 
    std::for_each(v.begin(), v.end(), 
     boost::bind(&foo::func2, this, _1, x)); 
} 

EDIT:おっと、そうI.はあわやました。

リフレクションでは、最初の動作例では本当に間違ったことはありませんが、可能であれば、メンバー関数よりも自由に機能するほうがよいでしょう - あなたのバージョンではシンプルさが増しています。

+0

の場合、コードは動作します。これはboost :: lamba :: bindで動作するはずです。私はboost :: bindをあまり使わなかった。 –

1

バインディングクラスメンバ関数にboost :: bindを使用しているときは、2番目の引数でオブジェクトコンテキストを指定する必要があります。したがって、2番目の引数がthis

関連する問題