我是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::
命名空间。
答案 0 :(得分:4)
我不知道任何类似于你的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生成的函数对象会重载很多常用的运算符,比如&lt;,所以你可以这样做:
Point leftmostPoint2 = *std::min_element(points.begin(), points.end(),
boost::bind( &Point::x, _1 ) < boost::bind( &Point::x, _2 ));
但我认为只有C ++ 0X的lambda才能真正实现简洁和清晰度:
Point leftmostPoint3 = *std::min_element(points.begin(), points.end(),
[](const Point& p1, const Point& p2){ return p1.x < p2.x; });