我很困惑当我们绑定到成员变量时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)));
答案 0 :(得分: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&lt;&gt; :: iterator(类型为std :: pair&lt; const key_type,value_type&gt;)的解除引用。这被传递给内部绑定,它取消引用成员指针,从而将(*it).second
返回到外部绑定,该绑定将该值传递给最终调用的print_string
方法:print_string( (*it).second )
。
(*it)
实际上是您询问的_1
。所有_#
都是占位符,也就是说,bind的结果将是一个仿函数,它将采用与占位符数定义的顺序中存在的不同占位符一样多的参数。在您给出的示例中,生成的仿函数采用单个参数_1
。
答案 1 :(得分:2)
boost::bind(&std::pair<U,V>::second, _1);
在功能上等同于
std::pair<U,V> p -> p.second
即。它是一个将pair<U,V>
映射到其second
成员的函数(对象)。