Как создать компаратор с Boost? - PullRequest
2 голосов
/ 17 июля 2010

Я новичок в Boost, но не в функциональном программировании, и я пытаюсь понять, где Boost может мне помочь.

У меня есть список 2D точек,и я хочу извлечь минимальную x координату.Класс Point имеет функцию-член float x() const, поэтому я могу использовать boost::mem_fn следующим образом:

boost::mem_fn(&Point::x)

Но для использования std::min_element мне нужен объект, который поддерживает bool operator()(Point const &, Point const &).Что-то вроде этого вымышленного compare_by:

leftmostPoint = std::min_element(
    points.begin(), points.end(),
    boost::compare_by(boost::mem_fn(&Point::x)));

Могу ли я использовать Boost для построения такого сравнения или мне нужно сделать это самому?


Обновление: вот мойреализации, но мне все еще интересно посмотреть, как Boost мог бы сделать это для меня.

template<typename F>
class CompareBy {
    F const d_f;
    public:
        CompareBy(F f) : d_f(f) { }
        template<typename T>
        bool operator()(T const &a, T const &b) const {
            return d_f(a) < d_f(b);
        }
};

template<typename F>
CompareBy<F> compare_by(F f) {
    return CompareBy<F>(f);
}

Использование: как указано выше, минус пространство имен boost::.

1 Ответ

4 голосов
/ 17 июля 2010

Мне неизвестна какая-либо форсированная конструкция, похожая на вашу Compare_by.
Тем не менее, Boost :: Bind может сделать свое дело.

Point leftmostPoint = *std::min_element(points.begin(), points.end(),
   boost::bind(std::less<Point::type_x>(), 
       boost::bind( &Point::x, _1 ), boost::bind( &Point::x, _2 )));

Да, это не красиво: /
К счастью, есть доступное сокращение синтаксиса, потому что функциональные объекты, созданные в boost :: bind, перегружают многие обычные операторы, например,

Point leftmostPoint2 = *std::min_element(points.begin(), points.end(),
boost::bind( &Point::x, _1 ) < boost::bind( &Point::x, _2 ));

Но я думаю, что только лямбда C ++ 0X действительно может достичь краткости и ясности:

Point leftmostPoint3 = *std::min_element(points.begin(), points.end(),
[](const Point& p1, const Point& p2){ return p1.x < p2.x; });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...