Инициализация Boost point C ++ - PullRequest
0 голосов
/ 04 июня 2018

Я использую библиотеки Boost для манипулирования точками в N-мерной области.Проблема в том, что я не могу найти способ их инициализации без установки каждой координаты отдельно.

Чтобы получить или установить координаты с этой библиотекой, следует использовать:

bg::model::point<double, 2, bg::cs::cartesian> point1; // Declaration
point1.set<0>(1.0);                                    // Coordinate 0 set 
point1.set<1>(2.0);                                    // Coordinate 1 set
double x = point1.get<0>();                            // Coordinate 0 get
double y = point1.get<1>();                            // Coordinate 1 get

Пример и информацию можно найти по адресу https://www.boost.org/doc/libs/1_67_0/libs/geometry/doc/html/geometry/reference/models/model_point.html

Однако я работаю с точкамив N-мерном пространстве, с N> 100, и я не могу позволить себе написать строку кода для каждой координаты вручную.Но что-то вроде этого:

bg::model::point<double, 2, bg::cs::cartesian> point1;
for(int i(0); i<NDIM; ++i){
    point1.set<i>(1.0);
}

не работает, потому что индекс координат должен быть постоянным значением.Не могли бы вы помочь мне найти способ автоматической инициализации координат?Я много чего перепробовал, ничего не получалось!

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете использовать шаблоны переменных и std::index_sequence для вывода индексов из NDIM и обрабатывать все вместе, используя синтаксис распаковки:

template <class Point, size_t... I>
void init(Point& p, std::index_sequence<I...>)
{
    int dummy[] = { (p.set<I>(1.0), 0)... };
    (void)dummy;
}

Синтаксис (void_func(), 0) вызывает функцию void, но возвращает 0.Это необходимо, потому что вы не можете использовать синтаксис распаковки ... для пустых функций.Присвоение его массиву и его использование (например, приведение к void) гарантирует, что ничего не будет оптимизировано.

Затем вызовите эту функцию следующим образом:

init(point1, std::make_index_sequence<NDIM>());

Обратите внимание, что NDIM должно быть const.

Для получения более подробной информации о том, как работает index_sequence, посмотрите здесь .

...