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

c++ stateful functor that populates vectors

本文关键字:状态 c++ 填充 向量 用于      更新时间:2023-10-16

我有一个关于函子的问题。我建立了一个简单的类:

    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为空?

std算法复制您的函子。CCD_ 2可能也会这样做。

您可以std::ref( functor )通过pseudo-ref传递它,这样您就会得到您想要的行为。

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

顺便说一句,inline的使用是多余的:类主体中定义的所有方法都是隐式inline。这是追踪bug的乐趣来源。

它不是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();