Помогите мне понять это использование boost :: bind - PullRequest
15 голосов
/ 15 ноября 2010

Пожалуйста, посмотрите на этот пример, опубликованный Йоханнесом Шаубом, чтобы отсортировать вектор пар:

Как отсортировать вектор пар на основе второго элемента пары?

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 <для этих двух связей и возвращает какой-то указатель на функцию (например, лямбду)? </p>

Вопрос 2:
Это сбивает меня с толку:

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

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

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

Ответы [ 2 ]

14 голосов
/ 15 ноября 2010

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

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

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

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

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

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

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

bind (& X :: f, args)

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

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

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

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

2 голосов
/ 15 ноября 2010
...