C ++: как использовать std :: less ‹int› с boost :: bind и boost :: lambda?

Я пытаюсь изучить библиотеки boost :: bind, boost :: lambda и то, как их можно использовать с алгоритмами STL. Предположим, у меня есть вектор пар int-string, который отсортирован по ключу int. Тогда место для вставки новой пары, сохраняя вектор отсортированным, можно найти следующим образом:

std::vector<std::pair<int, string> > entries;
...
int k = ...;

// Let's ignore std::lower_bound return value for now
std::lower_bound (entries.begin(), entries.end(), k, 
                  boost::bind (&std::pair<int, string>::first, _1) < k)

Теперь я хотел бы заменить operator< на объект функции (типа std::less<int> в этом примере):

std::less<int> comparator;

Как мне изменить приведенный выше код, чтобы он работал? Я не могу просто сделать

std::lower_bound (entries.begin(), entries.end(), k, 
                  comparator (boost::bind (&std::pair<int, string>::first, _1), k))

потому что std::less<int>::operator() не принимает то, что является возвращаемым типом boost::bind. Что мне здесь не хватает? TIA


person Laurynas Biveinis    schedule 25.11.2009    source источник


Ответы (1)


Все, что вам не хватает, - это еще один bind (и параметры шаблона на pair):

std::lower_bound(entries.begin(), entries.end(), k, 
                 boost::bind(comparator,
                             boost::bind(&std::pair<int, string>::first, _1),
                             k))

Вам не нужно делать это с оператором «меньше» в исходном коде, потому что Boost.Bind предоставляет перегрузки для этого оператора, которые знают, как обрабатывать возвращаемый тип boost::bind.

person Rob Kennedy    schedule 25.11.2009
comment
Таким образом, внешний boost :: bind выполняет магию, заставляя comparator.operator () принимать все, что производит внутренний boost :: bind. Спасибо! (Кстати, отсутствующие параметры шаблона пары - это просто моя ошибка редактирования) - person Laurynas Biveinis; 25.11.2009
comment
Я очень много раз испытывал искушение сделать это. Но когда вы отступаете, то понимаете, что ваш код очень трудно читать. И теперь, когда привязка является частью стандарта C ++, вы должны отметить, что только ускоренная реализация перегружает реляционные и логические операторы. - person Nikola Smiljanić; 25.11.2009