找不到某些提升库功能

Can't find certain Boost library function

本文关键字:功能 找不到      更新时间:2023-10-16

我正试图在c#中实现k-d树,我正在查看的源代码是c++中的Boost。我要求的函数是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结构体字段)似乎总是初始化为0,然后递增,直到达到dim。我不确定为什么会出现这种明显不必要的递归——它可能只是c++编译器的一个技巧(c++模板通常比相关的c#泛型更不清晰)。如果是这种情况,您可能只是能够从c#代码中完全删除递归方面。