c ++将部分数组(在某个偏移量处)转换为不同的类型

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

在OpenCV库中,Vec4f被定义为一个四元组浮点数,类似这样:

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]表示该直线上的一个点。

在很多情况下,我需要将其转换为二元组"Point"。在 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++ 线性代数库首先使用段、头和尾向量方法来做您想要的更多一点-class。通常最好接受那些试图首先做到这一点的人 class 因为您输入的内容中存在各种错误,可能需要您一段时间才能找到,如果您问什么是最易读的,那么该代码会总是在我的脖子后面竖起一些毛发......而且 OpenCV 的整个观点与 vec 概念是可疑的。

但是值得注意的是,数组保证是连续的,没有填充,所以用类似的东西来转换 various 是没有问题的。您需要小心转换结构,例如 Point2f,因为当涉及结构时很容易出现对齐和填充问题。当您编写该类型的代码并阅读标准的相关部分时,使用 static_asserts 是个好主意。