下面是關於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