You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确赋值Boost Geometry派生点类型?

解决Boost Geometry派生点类型无法调用assign_values的问题

问题原因

你遇到的问题根源有两个:

  1. 派生类taggedPoint_t没有提供默认构造函数,也未继承基类的构造函数,而Boost Geometry的assign_values等操作要求点类型必须能默认构造
  2. 手动调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:14:55