Не могу найти определенную функцию библиотеки Boost

Я пытаюсь реализовать дерево k-d в C #, а исходный код, который я смотрю, находится в C ++ с Boost. Функция, которую я пытаюсь найти, util::subtract(), Я искал всю документацию Boost, и я нигде не могу ее найти.

Строка № 94 — это функция, которую я пытаюсь перевести.
Полный файл можно найти здесь: https://github.com/gvd/kdtree/blob/master/kdtree.h

Если у кого-то есть лучший источник, из которого я могу реализовать, я был бы очень признателен за это.

1

Решение

То, на что вы обращаете внимание, это шаблон встроенной функции C ++, и он на самом деле определяется в верхней части файла заголовка, который вы связали (таким образом, util:: пространство имен, а не boost:: Пространство имен). В C # похоже, что вы могли бы реализовать эту логику в статической функции, если вы подняли Dimension поле вне C ++ struct и передать его просто как 4-й аргумент статической функции C #.

Есть 3 различных определения шаблона функции для subtract(...), но только один с веществом. Я добавлю сюда тело шаблона функции для полноты (обратите внимание, что он содержит рекурсивный вызов, где 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 #.

2

Другие решения


По вопросам рекламы [email protected]