Вот интересный вопрос о различных причудах языка C++. У меня есть пара функций, которые должны заполнять массив точек углами прямоугольника. Для него есть две перегрузки: один берет Point[5]
, другой - Point[4]
. Пятиточечная версия относится к замкнутому многоугольнику, тогда как 4-точечная версия - это когда вам просто нужно 4 угла, период.C++ для массива меньшего размера
Очевидно, что здесь существует некоторое дублирование работы, поэтому я хотел бы иметь возможность использовать 4-точечную версию для заполнения первых 4 точек версии с 5 точками, поэтому я не дублирую этот код. (Не то, чтобы это было много, чтобы дублировать, но у меня есть ужасные аллергические реакции всякий раз, когда я копирую и вставляю код, и я хотел бы избежать этого.)
Дело в том, что 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] Точка передачи массива по ссылке так что мы можем быть по крайней мере смутно уверены, что абонент проходит в правильном «из параметра».
Пожалуйста, отправьте код, в частности, ваши объявления функций. Функции, объявленные для принятия параметров как массивы, фактически принимают параметры в качестве указателей, поэтому вы не можете перегрузить разницу в размере массива параметра. –
Я должен был упомянуть, что они на самом деле массивы по ссылке, поэтому компилятор поддерживает понимание размера массива. –