请看一下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)
通常有某种函数指针作为绑定调用的第一个参数,但这里它是类成员的地址?特定绑定的结果是什么?
感谢您的时间和帮助
答案 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)