Boost指针的初始化(C++)

3

我正在使用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);
}

无法工作,因为坐标的索引需要是一个常量值。您能帮我找到一种自动初始化坐标的方法吗?我尝试了很多方法,但没有一个有效!


可能相关 - https://dev59.com/BVoU5IYBdhLWcg3wTVse - Joseph D.
1个回答

3
您可以使用可变参数模板和std::index_sequenceNDIM中推断索引,并使用展开语法一起处理所有内容:
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) 调用了一个无返回值的函数,但是会返回0。这是因为你不能对无返回值函数使用展开语法...。将其赋值给一个数组并使用它(例如将其转换为 void)可以确保没有任何内容被优化掉。
然后像这样调用该函数:
init(point1, std::make_index_sequence<NDIM>());

请注意,NDIM必须是const
有关index_sequence如何工作的更多详细信息,请查看此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接