7

当我们绑定到成员变量时,我对 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)));

来源

4

2 回答 2

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
}

在幕后 bind 正在编写不同的调用。生成的仿函数采用 std::map<>::iterator 的取消引用(std::pair< const key_type, value_type > 类型)。这被传递给内部绑定,取消引用成员指针,从而返回(*it).second到外部绑定,该外部绑定将该值传递给print_string最终调用的方法print_string( (*it).second )

(*it)实际上是_1你问的。全部_#都是占位符,也就是说,bind 的结果将是一个仿函数,它将采用与占位符数量定义的顺序存在的不同占位符一样多的参数。在您给出的示例中,生成的仿函数采用单个参数_1

于 2009-07-21T10:53:53.207 回答
2
boost::bind(&std::pair<U,V>::second, _1);

在功能上等同于

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

IE。pair<U,V>它是一个将 a 映射到其 second成员的函数(对象) 。

于 2009-07-21T11:58:37.630 回答