填充向量的 C++ 有状态仿函数
c++ stateful functor that populates vectors
我有一个关于函子的问题。我构建了一个简单的 class:
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 为空?
这不是 PolygonPrinter
的同一个实例。
Boost API 的定义是:
template<typename Geometry, typename Functor>
Functor for_each_point(Geometry & geometry, Functor f)
仿函数是拷贝传递的!因此,您实际上为 Boost API 创建了一个新实例,因此它不会影响您的实例。如果您想捕获新状态(在使用 for_each_point
之后),请使用 return 值来为您的实例重新分配一个 Boost returns。当然,这假定您的复制构造函数执行您期望的操作:以某种方式复制您需要的值。在您的特定情况下,您有默认的复制构造函数,因此它应该按预期工作。
PolygonPrinter<point_2d> polyPrinter;
polyPrinter = boost::geometry::for_each_point( polygon, polyPrinter );
polyPrinter.printPoints();
std
算法复制你的仿函数。 boost
可能也是如此。
你可以std::ref( functor )
通过伪引用传递它,你会得到你想要的行为。
boost::geometry::for_each_point( polygon, std::ref(polyPrinter) );
顺便说一句,您对 inline
的使用是多余的:在 class 的主体中定义的所有方法都是隐含的 inline
。这是追踪错误的一些乐趣的来源。
我有一个关于函子的问题。我构建了一个简单的 class:
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 为空?
这不是 PolygonPrinter
的同一个实例。
Boost API 的定义是:
template<typename Geometry, typename Functor>
Functor for_each_point(Geometry & geometry, Functor f)
仿函数是拷贝传递的!因此,您实际上为 Boost API 创建了一个新实例,因此它不会影响您的实例。如果您想捕获新状态(在使用 for_each_point
之后),请使用 return 值来为您的实例重新分配一个 Boost returns。当然,这假定您的复制构造函数执行您期望的操作:以某种方式复制您需要的值。在您的特定情况下,您有默认的复制构造函数,因此它应该按预期工作。
PolygonPrinter<point_2d> polyPrinter;
polyPrinter = boost::geometry::for_each_point( polygon, polyPrinter );
polyPrinter.printPoints();
std
算法复制你的仿函数。 boost
可能也是如此。
你可以std::ref( functor )
通过伪引用传递它,你会得到你想要的行为。
boost::geometry::for_each_point( polygon, std::ref(polyPrinter) );
顺便说一句,您对 inline
的使用是多余的:在 class 的主体中定义的所有方法都是隐含的 inline
。这是追踪错误的一些乐趣的来源。