C++ 将部分数组(在某些偏移量)转换为其他类型
c++ casting partial array (at some offset) to a different type
在 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。
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 通过指针偏移量访问结构变量值
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 是否有与 C# Structs/StructLayout 等效的功能,C++中的字段偏移量?
- 我的 sumASCII 函数中的此偏移量是多少?
- boost::序列化中的派生类偏移量计算.有效吗?
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 胎面偏移量的时间复杂度?
- 如何从 c++ 中的给定标准输入中获取每个字符的偏移量?
- 编译器在构造函数中计算的成员偏移量不正确
- 使用基地址和偏移量获取变量的地址
- c++ 读取进程内存基址 + 偏移量不起作用
- 将 pugixml 的结果偏移量转换为列/行
- C++ 将部分数组(在某些偏移量)转换为其他类型
- 通过强制转换 nullptr 获取成员变量的偏移量
- 在cv::Mat中将float转换为uchar的偏移量