找不到某些 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# 代码中删除递归方面。
我正在尝试在 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# 代码中删除递归方面。