下面是关于C++语言各种怪癖的一个有趣问题。我有一对函数,它们应该用一个矩形的角来填充一个点的数组。有两个重载:一个需要Point[5]
,另一个需要Point[4]
。 5点的版本是指一个封闭的多边形,而4点的版本是当你只需要4个角落时。将C++转换为更小的数组
显然这里有一些重复的工作,所以我希望能够使用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]传递一个数组按引用的点是,使我们可以为至少隐约确保呼叫者被以正确的传递“输出参数”。
请张贴代码,特别是您的函数声明。声明将参数作为数组的参数实际上将参数指定为指针,因此不能因参数的数组大小差异而导致重载。 – 2010-06-30 19:27:56
我应该提到它们实际上是按引用排列的,因此编译器会保持对数组大小的认识。 – 2010-06-30 19:35:25