Помогите мне понять это использование 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));

Мне показалось, что я понимаю boost:: bind, но у меня проблемы с этим.

Вопрос 1:

алгоритм сортировки ожидает функцию предиката в качестве третьего параметра. То, что я вижу здесь, является логическим выражением. Что мне не хватает?:

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

Включен ли оператор перегрузки библиотеки boost:: bind, для этих двух связок и возвращает какой-то указатель на функцию (например, лямбда)?

Вопрос 2:
Это меня пугает:

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

Обычно есть какой-то указатель на функцию в качестве первого параметра вызова привязки, но здесь это адрес члена класса? Каков результат этого конкретного связывания?

Спасибо за ваше время и помощь

Ответ 1

boost:: bind перегружает оператора! и реляционные и логические операторы ==,! =, <, < =, > , > =, & &, ||, поэтому именно поэтому вы видите "булево" выражение, но вы действительно получаете назад предикат функции.

Оттуда вы можете видеть, что вы привязываете второй член пары для 1-го и 2-го аргументов перегруженного меньше функции.

Что касается вашего второго вопроса: Boost bind распознает, когда вы передали указатель на член и рассматриваете его так, как если бы вы вызывали

bind<R>(mem_fun(&std::pair<int,int>::second), args);

Вот как описано в документации:

Использование bind с указателями на элементы

Указатели на функции-члены и указатели на данные не являются функциональных объектов, поскольку они не support operator(). Для удобства, bind принимает указатели элементов как свои первый аргумент, а поведение - как если boost:: mem_fn используется для преобразовать указатель элемента в функциональный объект. Другими словами, Выражение

bind (& X:: f, args)

эквивалентно

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

где R - возвращаемый тип X:: f (для функций-членов) или типа член (для членов данных.)

Вы можете найти эту и более информацию здесь.