如何正确赋值Boost Geometry派生点类型?
解决Boost Geometry派生点类型无法调用assign_values的问题
问题原因
你遇到的问题根源有两个:
- 派生类
taggedPoint_t没有提供默认构造函数,也未继承基类的构造函数,而Boost Geometry的assign_values等操作要求点类型必须能默认构造 - 手动调用
BOOST_GEOMETRY_REGISTER_POINT_2D会和基类point_xy已有的类型注册冲突,反而导致识别失败
正确实现方案
方案一:继承基类构造函数并补充自定义构造
直接继承point_xy的所有构造函数,同时保留自定义的带参数构造,这样既满足Boost Geometry的要求,又能添加额外数据:
#include <boost/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> namespace bg = boost::geometry; using point_t = bg::model::d2::point_xy<double>; struct taggedPoint_t : point_t { // 继承基类全部构造函数 using point_t::point_t; // 自定义构造:先默认构造基类,再初始化成员 taggedPoint_t(void* data) : point_t(), mData(data) {} void* mData; }; int main() { point_t p1; bg::assign_values(p1, 1.0, 2.0); taggedPoint_t p2(nullptr); bg::assign_values(p2, 2.0, 3.0); // 正常执行 // 也可以直接用坐标初始化派生类 taggedPoint_t p3(4.0, 5.0); p3.mData = &p1; }
方案二:使用组合模式(更灵活)
如果不想依赖继承,可将point_xy作为成员变量,然后注册自定义点类型:
#include <boost/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> namespace bg = boost::geometry; namespace cs = bg::cs; struct taggedPoint_t { bg::model::d2::point_xy<double> core_point; void* mData; // 提供默认构造函数 taggedPoint_t() : core_point(), mData(nullptr) {} taggedPoint_t(void* data) : core_point(), mData(data) {} taggedPoint_t(double x, double y, void* data = nullptr) : core_point(x, y), mData(data) {} }; // 注册自定义点类型,指定坐标访问方式 BOOST_GEOMETRY_REGISTER_POINT_2D(taggedPoint_t, double, cs::cartesian, core_point.x(), core_point.y()) int main() { taggedPoint_t p2(nullptr); bg::assign_values(p2, 2.0, 3.0); // 正常执行 }
重要提示
- 继承
point_xy时无需手动注册类型,Boost Geometry会自动识别其为点类型的派生类 - 所有Boost Geometry的几何类型操作都要求类型具备默认构造能力,这是核心前提
- 组合模式适合需要完全自定义结构的场景,但必须正确注册坐标的访问方法
内容的提问来源于stack exchange,提问作者fhw72
相关产品推荐
相关产品推荐

