【问题标题】:c++ stateful functor that populates vectors填充向量的 c++ 有状态函子
【发布时间】:2015-03-19 02:24:25
【问题描述】:

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

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

【问题讨论】:

  • 我猜,您的 for_each_point 正在获取原始 polyPrinter 的副本。因此,副本填充了点,您会看到它,但原始仍然是空的

标签: c++ boost functor boost-geometry


【解决方案1】:

std 算法复制你的函子。 boost 可能也是这样。

你可以std::ref( functor )通过伪引用传递它,你会得到你想要的行为。

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

顺便说一句,您对inline 的使用是多余的:在类的主体中定义的所有方法都隐含地为inline。这是追踪错误的一些乐趣来源。

【讨论】:

  • @alvini 如果这解决了您的问题,将其标记为答案的官方方法是给它一个复选标记。左侧有一个按钮可以按下。
【解决方案2】:

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

【讨论】:

  • 我明白了!谢谢。我早该想到的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多