这是一个关于 C++ 语言的各种怪癖的有趣问题。我有一对函数,它们应该用矩形的角填充点数组。它有两个重载:一个需要 a Point[5]
,另一个需要 a Point[4]
。5 点版本指的是一个封闭的多边形,而 4 点版本是指您只需要 4 个角的时候。
显然这里有一些重复的工作,所以我希望能够使用 4 点版本来填充 5 点版本的前 4 点,所以我没有重复该代码。(并不是说复制太多,但每当我复制和粘贴代码时,我都会有可怕的过敏反应,我想避免这种情况。)
问题是,C++ 似乎并不关心将 a 转换T[m]
为T[n]
where的想法n < m
。static_cast
似乎认为这些类型由于某种原因不兼容。reinterpret_cast
当然,它处理得很好,但它是一种危险的动物,作为一般规则,最好尽可能避免。
所以我的问题是:是否有一种类型安全的方法可以将一个大小的数组转换为数组类型相同的较小大小的数组?
[编辑] 代码,是的。我应该提到参数实际上是对数组的引用,而不仅仅是指针,因此编译器知道类型差异。
void RectToPointArray(const degRect& rect, degPoint(&points)[4])
{
points[0].lat = rect.nw.lat; points[0].lon = rect.nw.lon;
points[1].lat = rect.nw.lat; points[1].lon = rect.se.lon;
points[2].lat = rect.se.lat; points[2].lon = rect.se.lon;
points[3].lat = rect.se.lat; points[3].lon = rect.nw.lon;
}
void RectToPointArray(const degRect& rect, degPoint(&points)[5])
{
// I would like to use a more type-safe check here if possible:
RectToPointArray(rect, reinterpret_cast<degPoint(&)[4]> (points));
points[4].lat = rect.nw.lat; points[4].lon = rect.nw.lon;
}
[Edit2] 通过引用传递数组的目的是让我们至少可以模糊地确定调用者正在传递正确的“输出参数”。