我正在使用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
但是,我使用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值。你能帮我找到一种自动初始化坐标的方法吗?我尝试了很多东西,没有用!
您可以使用可变参数模板和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。