Boost 点 C++ 的初始化
Initialization of a Boost point C++
我正在使用 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 维 space 中处理点,其中 N > 100,我无法为每个坐标手动编写一行代码。但是像这样的事情:
bg::model::point<double, 2, bg::cs::cartesian> point1;
for(int i(0); i<NDIM; ++i){
point1.set<i>(1.0);
}
不起作用,因为坐标的索引需要是一个常量值。你能帮我想办法自动初始化坐标吗?我尝试了很多东西,但没有任何效果!
您可以使用可变参数模板和 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 函数,但是 returns 0
。这是必要的,因为您不能对 void 函数使用解包语法 ...
。将它分配给一个数组并使用它(例如将它转换为 void
)确保没有任何优化。
然后像这样调用这个函数:
init(point1, std::make_index_sequence<NDIM>());
注意NDIM
必须是const
。
有关 index_sequence
工作原理的更多详细信息,请查看 here。
我正在使用 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 维 space 中处理点,其中 N > 100,我无法为每个坐标手动编写一行代码。但是像这样的事情:
bg::model::point<double, 2, bg::cs::cartesian> point1;
for(int i(0); i<NDIM; ++i){
point1.set<i>(1.0);
}
不起作用,因为坐标的索引需要是一个常量值。你能帮我想办法自动初始化坐标吗?我尝试了很多东西,但没有任何效果!
您可以使用可变参数模板和 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 函数,但是 returns 0
。这是必要的,因为您不能对 void 函数使用解包语法 ...
。将它分配给一个数组并使用它(例如将它转换为 void
)确保没有任何优化。
然后像这样调用这个函数:
init(point1, std::make_index_sequence<NDIM>());
注意NDIM
必须是const
。
有关 index_sequence
工作原理的更多详细信息,请查看 here。