これは、C++ 言語のさまざまな癖に関する興味深い質問です。ポイントの配列を四角形の角で埋めることになっている関数のペアがあります。それには 2 つのオーバーロードがあります。1 つは を受け取り、Point[5]
もう 1 つは を受け取りますPoint[4]
。5 ポイント バージョンは閉じた多角形を参照しますが、4 ポイント バージョンは 4 つのコーナー、ピリオドだけが必要な場合です。
明らかに、ここには作業の重複があるので、4 ポイント バージョンを使用して 5 ポイント バージョンの最初の 4 ポイントを入力できるようにしたいので、そのコードは複製しません。(重複するほどではありませんが、コードをコピーして貼り付けるたびにひどいアレルギー反応を起こすので、それは避けたいと思います。)
T[m]
問題は、C++ はa を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] 参照渡し配列を渡すポイントは、呼び出し元が正しい「出力パラメーター」を渡していることを少なくとも漠然と確信できるようにすることです。