帮助我理解boost :: bind的这种用法

时间:2010-11-15 13:44:39

标签: c++ boost-bind

请看一下Johannes Schaub发布的这个例子来对一对对象进行排序:

How do I sort a vector of pairs based on the second element of the pair?

std::sort(a.begin(), a.end(), 
          boost::bind(&std::pair<int, int>::second, _1) <
          boost::bind(&std::pair<int, int>::second, _2));

我以为我确实理解了boost :: bind,但是我遇到了这个问题。

问题1:

排序算法期望谓词函数作为第三个参数。我在这里看到的是一个布尔表达式。我错过了什么?:

boost::bind(&std::pair<int, int>::second, _1) < boost::bind(&std::pair<int, int>::second, _2)

boost :: bind库重载运算符&lt;对于那两个绑定,并返回某种函数指针(如lambda)?

问题2:
这让我很困惑:

boost::bind(&std::pair<int, int>::second, _1)

通常有某种函数指针作为绑定调用的第一个参数,但这里它是类成员的地址?特定绑定的结果是什么?

感谢您的时间和帮助

2 个答案:

答案 0 :(得分:14)

boost :: bind重载运算符!和关系和逻辑运算符==,!=,&lt;,&lt; =,&gt;,&gt; =,&amp;&amp;,||,所以这就是你“看到”一个布尔表达式的原因,但你是真的回到函数谓词。

从那里你可以看到你正在绑定第二个成员,用于重载小于函数的第一个和第二个参数。

至于你的第二个问题: 当您传递指向成员的指针并将其视为您调用

时,Boost绑定将识别
bind<R>(mem_fun(&std::pair<int,int>::second), args);

这是文档描述的方式:

  

将bind与指向成员的指针一起使用

     

指向成员函数和指针   指向数据成员的指针不是   函数对象,因为它们没有   支持operator()。为了方便,   bind接受成员指针作为其   第一个参数,行为是   如果已经习惯了boost :: mem_fn   将成员指针转换为   功能对象。换句话说,   表达

     

bind(&amp; X :: f,args)

     

相当于

     

bind(mem_fn(&amp; X :: f),args)

     

其中R是X :: f的返回类型   (对于成员函数)或类型   成员(对于数据成员。)

您可以找到此信息及更多信息here

答案 1 :(得分:2)