找不到某些 Boost 库函数

Can't find certain Boost library function

我正在尝试在 C# 中实现一个 k-d 树,我正在查看的源代码是在带有 Boost 的 C++ 中。我要查找的函数是 util::subtract()。我已经搜索了所有 Boost 的文档,但在任何地方都找不到。

第 94 行是我要翻译的函数。 完整文件可在此处找到:https://github.com/gvd/kdtree/blob/master/kdtree.h

如果有人有更好的资源可供我实施,我也将不胜感激。

您看到的是一个 C++ 内联函数模板,它实际上是在您链接的头文件的顶部定义的(因此是 util:: 命名空间而不是 boost:: 命名空间)。在 C# 中,如果将 Dimension 字段从包含 struct 的 C++ 中提取出来并将其作为第四个参数简单地传递给 C# 静态函数,那么看起来您可以在静态函数中实现此逻辑。

subtract(...)有3种不同的函数模板定义,但只有一种有实质内容。为了完整起见,我将在此处包含该函数模板主体(请注意,它包含一个递归调用,其中 Dimension 字段用作计数器,一旦它等于 dim 就会限制递归):

   template <typename Point, std::size_t Dimension, std::size_t Count>
   struct dimension_extractor {
       static inline typename boost::geometry::default_distance_result<Point>::type subtract(const Point &p1, const Point &p2, std::size_t dim) {
            if (Dimension == dim) {
                return boost::geometry::get<Dimension>(p1) - boost::geometry::get<Dimension>(p2);
            }
            return dimension_extractor<Point, Dimension + 1, Count>::subtract(p1, p2, dim);
       }
   };

无可否认,在不检查 boost::geometry 库的情况下,直接粗略地移植到 C# 可能看起来像这样的伪代码:

public static boost.geometry.default_distance_result<Point>.type subtract(Point p1, Point p2, uint dim, uint currDim)
{
    if (currDim == dim)
    {
        // it looks like .get() is a templated function, so the actual call syntax may be somewhat different
        return boost.geometry.get(p1, currDim) - boost.geometry.get(p2, currDim);
    }
    else
        return subtract(p1, p2, dim, currDim + 1);
}

在 C++ 上下文中,currDim 参数(表示 Dimension 结构字段)似乎总是初始化为零并递增直到达到 dim。我不确定为什么会发生这种明显不必要的递归——它可能只是一个 C++ 编译器技巧(C++ 模板通常不如相关的 C# 泛型那么清晰)。如果是这种情况,您也许可以完全从 C# 代码中删除递归方面。