¿Cuál es una explicación para la siguiente línea de código?

Aquí está el código original de tu comentario:

Real fBaseAngularWheelSpeed = Min(fHeadingLength, m_sWheelTurningParams.MaxSpeed);

Primero, parece que no estás seguro de lo que significa “Real”. Esto se refiere a un “número real”, es decir, cualquier número sin un componente imaginario. Cuando escribió su pregunta, puso el valor de retorno como int, pero ints no puede tener partes fraccionarias, por lo que es una tergiversación de lo que está haciendo el código. La función Min seguramente devolverá un Real, no un int.

El bit sobre el que realmente está preguntando es la llamada a la función Min . Supongo que sabes lo que es una llamada de función, pero estás un poco confundido acerca de lo que están haciendo esos corchetes angulares. Min no es una definición de función, es una plantilla de función; eso significa que es un tipo de máquina para generar funciones. Por el nombre, probablemente se lee algo como esto:

plantilla
T Min (T a, T b)
{devolver a <b? a: b; }

En otras palabras, su trabajo es devolver el mínimo de dos valores. La única razón de la plantilla es para que pueda hacer esto para cualquier tipo de datos, ya sea un entero, flotante, doble, real, vectorial o alguna otra clase; Mientras el operador menor que trabaja en él, esta plantilla generará una función con éxito.

Normalmente, no necesita decirle explícitamente a la plantilla cuál es su parámetro; Min( a, b ) funciona bien. Los corchetes angulares generalmente solo son necesarios si el compilador no puede inferir el tipo de plantilla a partir de los parámetros que le pasa. Sin embargo, si el parámetro es ambiguo, por ejemplo, si a y b son de diferentes tipos, entonces podría ser necesario dar el parámetro de plantilla específicamente. Entonces, uno podría arriesgarse a adivinar que, en este caso, fHeadingLength o m_sWheelTurningParams.MaxLength podría no ser del tipo “Real”, y el autor de este código quería asegurarse de que se convertirían a Real antes de tomar el mínimo.

Parece que la denominación de variables y tipos en el código original tuvo una gran influencia del estilo de codificación de Windows de finales de los noventa. El prefijo “f” implica que la variable es en realidad un flotante. Esa notación se llama sistema húngaro (http://stackoverflow.com/questio…) y es un olor a código. El tipo “Real” es probablemente un typedef para flotante o doble, y probablemente existe para que, si se necesita más precisión más adelante, se pueda cambiar por una clase especializada de números de alta precisión.

El prefijo m_s implica que la variable es un miembro estático de la clase actual. Nombrar una MaxSpeed ​​variable con una letra mayúscula inicial no coincide con ninguna de las otras convenciones de nomenclatura aquí y solo parece incompetente. Si es una constante, probablemente debería ser MAX_SPEED.

Es el código C ++.

Esa línea establece un número entero y lo nombra ‘Velocidad’, y le da como valor inicial la salida de la función ‘min’, que es el más pequeño de sus parámetros.
La parte de esa línea es el uso de un meta parámetro, aquí entre ‘<' y '>‘. Ese parámetro indica a la función que los parámetros convencionales enviados a la función (‘a’ y ‘b’) deben tratarse como instancias reales.
Eso significa que la función comparará estos valores como Reales y devolverá la menor de estas instancias, que se transmitirá a la variable Velocidad para convertirse en su valor, lo que significa que debe ocurrir un CAST implícito, si el tipo int tiene un overide en su operador de asignación para un parámetro Real, por ejemplo, o si se puede construir un Int a partir de un parámetro Real. De lo contrario, el compilador puede estar en desacuerdo con esa operación.

Esta es una función genérica que alguien ha escrito una función que encuentra el mínimo de dos números. Se puede usar con una variedad de diferentes tipos de datos, lo que lo hace genérico. Entonces min (a, b) encontraría el mínimo de dos enteros. min (a, b) encuentra el mínimo de dos números de doble precisión. Alguien ha definido un tipo de datos “Real” que supongo que representa números reales, lo que pensamos de decimales sin fin, como π. Esta función luego encuentra el mínimo de dos números reales.

Diría que usar funciones genéricas es realmente excesivo para algo tan simple como encontrar el mínimo. Puede ser el resultado de que alguien aprenda sobre funciones genéricas y quiera probarlas. También sospecho del tipo de datos Real, en realidad no puedes representar números reales exactamente en una computadora. Es mejor usar Double que tiene propiedades conocidas.

Se está utilizando una plantilla Min definida por el usuario con un tipo de datos Real.

La suposición de los nombres es que la función calcula el mínimo, posiblemente como un alias de algún tipo para min – Referencia de C ++, que también es una función con plantilla.

Se está generando un int. Esto podría deberse a que la función Min se redondea a un int o porque Min devuelve un resultado Real que se trunca a un int mediante la conversión de tipo numérico nativo C ++ estándar.

Es bastante común que los programadores que hacen mucho punto flotante definan su propio tipo de punto flotante como un alias para doble o flotante u otros tipos de punto flotante estándar. Usar nombres en mayúsculas para tipos y funciones personalizados es una buena práctica, ya que los hace destacar.

No hay nada en el lenguaje C ++ que garantice la semántica de lo que sucede con estas funciones o los tipos de datos.

Debe suponer que el programador que los escribió ha conservado la semántica de tipos y funciones similares en el lenguaje, o ser capaz de inspeccionar el código fuente.

Esa línea de código podría significar legalmente dibujar una simulación 3D de los asteroides a y b que colisionan y devolver un número entero de la velocidad del fragmento más grande.

Ejemplo fantasioso pero enfatiza que realmente no tienes garantías.

Asignar la salida de una plantilla de función real a un int … no se considera la mejor práctica en …
(Lea la falla de ARIANE 5 – Informe completo en algún momento)

Min es una plantilla que toma dos argumentos (supongo que del tipo indicado) y supongo que devuelve un valor del mismo tipo. En este caso, ese tipo es Real. Sin embargo, está utilizando un número entero para la velocidad, por lo que supongo que Real se convierte automáticamente en int, incluso si está truncado. Esto puede deberse al hecho de que Real es simplemente un tipo de definición de doble.

Compara los números reales ayb , toma uno menor, arroja su valor al tipo entero y lo asigna a la velocidad variable que es el tipo entero.