c++ - Boost 点 C++ 的初始化

标签 c++ boost constants boost-geometry

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

不起作用,因为坐标的索引需要是一个常量值。你能帮我想办法自动初始化坐标吗?我尝试了很多东西,但没有任何效果!

最佳答案

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

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

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

注意 NDIM 必须是 const

有关 index_sequence 工作原理的更多详细信息,请查看 here .

关于c++ - Boost 点 C++ 的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50675772/

相关文章:

c++ - 从函数调用 C++ 程序?

javascript - 如何使用 C++ 通过 websocket 发送数据?

c++ - 如何使用具有递归模板函数的线程

c++ - 关于 C++ 中的 const 指针的问题?

c++ - 如何使用 boost::iostreams 更改缓冲区大小?

c++ - 使用模板友元函数时未解析的重载函数类型

c++ - 在 x3 中动态切换符号表

C++ 和 Boost XML 存档(序列化): Can I specify the tag name for elements?(默认值: "item")

C符号常量+结构

php - Perl 有类似于 PHP 的 constant() 的东西吗?