【发布时间】:2011-03-10 07:43:14
【问题描述】:
这是一个关于 C++ 语言的各种怪癖的有趣问题。我有一对函数,它们应该用矩形的角填充点数组。它有两个重载:一个采用Point[5],另一个采用Point[4]。 5 点版本指的是一个封闭的多边形,而 4 点版本是指您只需要 4 个角,句号。
显然这里有一些重复的工作,所以我希望能够使用 4 点版本来填充 5 点版本的前 4 点,所以我没有重复该代码。 (并不是说复制太多,但每当我复制和粘贴代码时,我都会有可怕的过敏反应,我想避免这种情况。)
问题是,C++ 似乎并不关心将T[m] 转换为T[n] 的想法,其中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] 通过引用传递数组的目的是让我们至少可以模糊地确定调用者正在传递正确的“输出参数”。
【问题讨论】:
-
请发布代码,特别是您的函数声明。声明为将参数作为数组的函数实际上将参数作为指针,因此您不能因参数的数组大小差异而重载。
-
我应该提到它们实际上是数组引用,因此编译器会保持数组大小的意识。
标签: c++ arrays reinterpret-cast