Мне неизвестна какая-либо форсированная конструкция, похожая на вашу 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; });