填充向量的c ++有状态函子

时间:2015-03-19 02:24:26

标签: c++ boost functor boost-geometry

我对仿函数有疑问。我建了一个简单的类:

    class PolygonPrinter { 
        private:
            std::vector<float> x;
            std::vector<float> y;
        public:
            inline void operator()(Point& p) {
                x.push_back(boost::geometry::get<0>(p));
                y.push_back(boost::geometry::get<1>(p));
            }

            void printPoints() {
                for(int i=0; i < x.size(); i++) {
                    std::cout << "(" 
                              << x[i] << "," << y[i] 
                              << ")" << std::endl;
                }
            }
    }

我想用作仿函数。这用于

之类的东西
    PolygonPrinter<point_2d> polyPrinter;
    boost::geometry::for_each_point( polygon, polyPrinter );
    polyPrinter.printPoints();

现在看来仿函数部分工作正常,因为我看到向量填充了所有多边形元素(因此for_each_point按预期工作),但是,第三个调用(printPoints)不打印任何点,实际上两个向量都是空的。我想这种行为是可以预料的,然而,我无法理解向量是如何被清除的。我以为你可以有状态的玩家。

为什么polyPrinter实例中的向量字段x和y为空?

2 个答案:

答案 0 :(得分:2)

std算法会复制您的仿函数。 boost可能会做同样的事情。

您可以std::ref( functor )通过伪参考传递它,并且您将获得所需的行为。

boost::geometry::for_each_point( polygon, std::ref(polyPrinter) );

另外,使用inline是多余的:在类的主体中定义的所有方法都是隐式inline。这是追踪错误的一些乐趣的来源。

答案 1 :(得分:0)

它不是PolygonPrinter的相同实例。

Boost API的定义是:

template<typename Geometry, typename Functor>
Functor for_each_point(Geometry & geometry, Functor f)

仿函数通过副本传递!因此,您实际上为Boost API创建了一个新实例,因此它不会影响您的实例。如果要捕获新状态(在使用for_each_point之后),请使用返回值通过一个Boost返回重新分配实例。当然,这假设您的复制构造函数符合您的期望:以某种方式复制您需要的值。在您的特定情况下,您具有默认的复制构造函数,因此它应该按预期工作。

PolygonPrinter<point_2d> polyPrinter;
polyPrinter = boost::geometry::for_each_point( polygon, polyPrinter );
polyPrinter.printPoints();