2009-07-21 31 views
7

メンバ変数にバインドするときにboost :: bindは何をするのか混乱します。メンバー関数へのバインドでは、本質的に関数オブジェクトを作成し、それを引数に渡して渡すか、遅延させ、プレースホルダーで置き換えます。メンバ変数へのバインド

しかし、この表現は、舞台裏で何をするのか:

boost::bind(&std::pair::second, _1); 

プレースホルダ_1の代わりに置換しますか?

私はこの中には、ブーストの記事からこの例を読んで見つけ::バインド:それはメンバーポインタを使用して渡されたに適用される舞台裏

void print_string(const std::string& s) { 
    std::cout << s << '\n'; 
} 

std::map<int,std::string> my_map; 
my_map[0]="Boost"; 
my_map[1]="Bind"; 

std::for_each(
    my_map.begin(), 
    my_map.end(), 
    boost::bind(&print_string, boost::bind(
     &std::map<int,std::string>::value_type::second,_1))); 

source

答えて

4

引数。バインドが異なる呼び出しを構成された舞台裏

int main() 
{ 
    std::pair< int, int > p1 = make_pair(1, 2); 
    std::pair< int, int > p2 = make_pair(2, 4); 
    int std::pair<int,int>::*ptr = &std::pair<int,int>::second; // pointer to second member 

    std::cout << p1.*ptr << std::endl; // 2 dereference pointer to member 
    std::cout << p2.*ptr << std::endl; // 4 dereference pointer to member 
} 

:それはので、ここでメンバーの使用へのポインタの簡単な例で、バインドのコンテキストで非常に複雑です。生成されたファンクタは、std :: map <> :: iterator(型std :: pair < const key_type、value_type>)の参照を取ります。これは内部バインドに渡され、メンバポインタをデリファレンスして、最終コールのprint_stringメソッドにその値を渡す外部バインドに(*it).secondを返します。print_string((*it).second)

(*it)実際には_1です。すべて_#はプレースホルダです。つまり、バインドの結果は、プレースホルダの数で定義された順序で異なるプレースホルダが存在するため、多くの引数をとるファンクタになります。与えた例では、結果のファンクタは単一の引数_1をとります。

2
boost::bind(&std::pair<U,V>::second, _1); 

std::pair<U,V> p -> p.second 

すなわち機能的に同等です。 pair<U,V>をそのメンバーのsecondにマップする関数(オブジェクト)です。

関連する問題