Aquí hay una pregunta interesante sobre las diversas peculiaridades del lenguaje C++. Tengo un par de funciones, que se supone que llenan una serie de puntos con las esquinas de un rectángulo. Hay dos sobrecargas: una toma un Point[5]
, la otra toma un Point[4]
. La versión de 5 puntos se refiere a un polígono cerrado, mientras que la versión de 4 puntos es cuando solo quieres las 4 esquinas, punto.C++ elenco a la matriz de un tamaño más pequeño
Obviamente, aquí hay algo de duplicación de trabajo, por lo que me gustaría poder utilizar la versión de 4 puntos para llenar los primeros 4 puntos de la versión de 5 puntos, así que no estoy duplicando ese código. (No es que sea mucho para duplicar, pero tengo reacciones alérgicas terribles cada vez que copio y pego código, y me gustaría evitar eso.)
El problema es que a C++ no parece importarle la idea de convirtiendo un T[m]
a un T[n]
donde n < m
. static_cast
parece pensar que los tipos son incompatibles por alguna razón. reinterpret_cast
lo maneja bien, por supuesto, pero es un animal peligroso que, como regla general, es mejor evitar si es posible.
Así que mi pregunta es: ¿hay una forma segura de tipo de lanzar una matriz de un tamaño a una matriz de un tamaño más pequeño donde el tipo de matriz es el mismo?
[Editar] Código, sí. Debería haber mencionado que el parámetro es realmente una referencia a una matriz, no simplemente un puntero, por lo que el compilador conoce la diferencia de tipo.
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] El punto de pasar una matriz por referencia es por lo que podemos ser al menos vagamente seguro de que la persona que llama está pasando en una correcta "fuera parámetro".
Por favor, publique el código, específicamente sus declaraciones de funciones. Las funciones que se declaran para tomar parámetros como matrices en realidad toman parámetros como punteros para que no se pueda sobrecargar por una diferencia en el tamaño de la matriz de un parámetro. –
Debería haber mencionado que en realidad son matrices por referencia, por lo que el compilador tiene conocimiento del tamaño de la matriz. –