代码之家  ›  专栏  ›  技术社区  ›  navigator

绑定到成员变量

  •  7
  • navigator  · 技术社区  · 15 年前

    当我们绑定到成员变量时,Boost::Bind会做什么,我对此感到困惑。通过绑定到成员函数,我们基本上创建了一个函数对象,然后调用它,将通过占位符提供或延迟并替换的参数传递给它。

    但是这个表达在幕后有什么作用:

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

    替换占位符1的内容是什么?

    我在阅读关于boost::bind:

    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

    2 回复  |  直到 15 年前
        1
  •  4
  •   David Rodríguez - dribeas    15 年前

    在后台,它使用一个成员指针并将其应用于传入参数。在绑定的上下文中,它相当复杂,因此下面是指向成员用法的指针的简单示例:

    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<>::迭代器(std::pair<const key_type,value_type>)的解引用。传递到内部绑定,取消引用成员指针,从而返回 (*it).second 传递该值到 print_string 最终调用的方法: print_string( (*it).second ) .

    (*it) 其实是 _1 你问过。所有 _# 是占位符,也就是说,绑定的结果将是一个函数,它将采用与不同占位符相同的参数,其顺序由占位符的数量定义。在给出的示例中,得到的函数采用单个参数 Y1 .

        2
  •  2
  •   Marc Mutz - mmutz    15 年前
    boost::bind(&std::pair<U,V>::second, _1);
    

    在功能上等同于

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

    也就是说,它是一个映射 pair<U,V> 对其 second 成员。