[英]Can't find certain Boost library function
我正在嘗試在C#中實現一個kd樹,而我正在尋找的源是在帶有Boost的C ++中。 我要查找的功能是util::subtract()
。 我已經搜索了Boost的所有文檔,但找不到任何地方。
行號94是我要翻譯的功能。 完整文件可以在這里找到: https : //github.com/gvd/kdtree/blob/master/kdtree.h
如果有人可以提供更好的資源,我也將不勝感激。
您正在查看的是C ++內聯函數模板,它實際上是在鏈接的頭文件的頂部定義的(因此util::
名稱空間而不是boost::
名稱空間)。 在C#中,如果將Dimension
字段從C ++封閉struct
移出並將其簡單地作為第4個參數傳遞給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#代碼中完全刪除遞歸方面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.