用于填充向量的c++有状态函子
c++ stateful functor that populates vectors
我有一个关于函子的问题。我建立了一个简单的类:
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();
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- q网络回复 无状态码或错误,但失败