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

nab*_*lke 15 c++ boost-bind

请看一下Johannes Schaub发布的这个例子来排序对的向量:

如何根据对的第二个元素对对向量进行排序?

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

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

问题1:

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

boost::bind(&std::pair<int, int>::second, _1) < boost::bind(&std::pair<int, int>::second, _2)
Run Code Online (Sandbox Code Playgroud)

对于那两个绑定,boost :: bind库是否重载operator <并且正在返回某种函数指针(如lambda)?

问题2:
这让我感到困惑:

boost::bind(&std::pair<int, int>::second, _1)
Run Code Online (Sandbox Code Playgroud)

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

感谢您的时间和帮助

RC.*_*RC. 14

boost :: bind重载运算符!和关系和逻辑运算符==,!=,<,<=,>,> =,&&,||,所以这就是为什么你"看到"一个布尔表达式,但你真的得到了一个函数谓词.

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

至于你的第二个问题:Boost bind会在你传递指向成员的指针并将其视为你调用时将其识别出来

bind<R>(mem_fun(&std::pair<int,int>::second), args);
Run Code Online (Sandbox Code Playgroud)

这是文档描述的方式:

使用绑定指向成员的指针

指向成员函数和指向数据成员的指针不是函数对象,因为它们不支持operator().为方便起见,bind接受成员指针作为其第一个参数,行为就像使用boost :: mem_fn将成员指针转换为函数对象一样.换句话说,表达

bind(&X :: f,args)

相当于

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

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

您可以在此处找到此信息和更多信息.