C++ 将部分数组(在某些偏移量)转换为其他类型

c++ casting partial array (at some offset) to a different type

本文关键字:偏移量 转换 类型 其他 数组 C++      更新时间:2023-10-16

在 OpenCV 库中,Vec4f被定义为 4 元组浮点数,类似于以下内容:

struct Vec4f {
    float data[4];
    /* here we may have some methods for this struct */
    inline float operator [] (int i) { return data[i]; }
};

有时它用于表示一条线:data[0-1] 表示该线的单位方向向量,而 data[2-3] 表示该线上的点。

在许多情况下,我需要将其转换为两个元组的"点"。 在OpenCV中,点(或向量)的定义类似于以下内容:

struct Point2f {
     float x;  // value for x-coordination
     float y;  // value for y-coordination
};

我想转换一行:

Vec4f myLine;

到方向向量和该线上的点:

Point2f  & lineDirectionalVector;
Point2f  & linePoint;

我不想复制它,所以我只使用引用。因此,我写道:

Point2f  & lineDirectionalVector =  *(Point2f*)(&myLine[0]);
Point2f  & linePoint=  *(Point2f*)(&myLine[2]);

问题是:这是一种好的做法? 如果没有,我该怎么做?假设第一个可以这样写:

Point2f  & lineDirectionalVector = reinterpret_cast<Point2f>(myLine);

有什么建议吗?首选方式?或者也许我只是做一个这样的副本:

Point2f  lineDirectionalVector(myLine[0], myLine[1]);
Point2f  linePoint(myLine[2], myLine[3]);

哪个更具可读性...

Eigen C++ 线性代数库使用段、头和尾向量方法做你想要的更一流的工作。 通常最好接受那些试图让它成为一流的东西,因为你输入的内容中存在各种错误,可能需要你一段时间才能找到,如果你问什么是最易读的,那么代码总是会让我的脖子后面竖起一些毛发......OpenCV的整个观点与vec概念也是可疑的。

然而,值得注意的是,数组保证是连续的,没有填充,所以用这样的东西来铸造各种东西是没有问题的。 您需要小心铸造结构,例如 Point2f,因为当涉及结构时,很容易出现对齐和填充问题。 在编写此类代码并读取标准的相关部分时,最好使用 static_asserts。