初始化Boost点C ++

问题描述 投票:3回答:1

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

不起作用,因为坐标的索引需要是一个const值。你能帮我找到一种自动初始化坐标的方法吗?我尝试了很多东西,没有用!

c++ boost const boost-geometry
1个回答
3
投票

您可以使用可变参数模板和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。这是必要的,因为您不能将unpack语法...用于void函数。将它分配给一个数组并使用它(例如将其转换为void)可确保没有任何优化。

然后像这样调用这个函数:

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

请注意,NDIM必须是const

有关index_sequence如何工作的更多详细信息,请查看here

© www.soinside.com 2019 - 2024. All rights reserved.