2011-04-07 5 views

Respuesta

8

Si C++, use numeric_limits, fin de.

EDITAR: Bien, según el comentario de James, no "fin de". - Las excepciones son plantillas y etiquetas de casos. Pero no puedo ver el uso de una etiqueta de caja para el mínimo o máximo, o una plantilla para ellos, pero supongo que no he visto todas las posibilidades ...

Supongo que mi punto es que la plantilla numeric_limits es más útil más allá de max() y min() ...

+1

Pruébelo en un contexto donde se requiere una expresión constante integral. Diga la instancia de una plantilla, o en una etiqueta de caso. O para tipos más pequeños, como una dimensión de matriz ('UCHAR_MAX + 1' es frecuente). –

+0

@James, hmm ... bien, voy a editar para las plantillas y las etiquetas de las cajas, aunque no estoy seguro sobre las dimensiones de la matriz ... – Nim

+3

Nota importante: dado que C++ 11 'std :: numeric_limits :: max()' es 'constexpr', entonces, la excepción ya no es válida. – juanchopanza

1

En ciertos contextos (por ejemplo case etiquetas no tipo de parámetros de plantilla,) se espera una constante numérica, y numeric_limits no soporta este: numeric_limits<int>::max() no es una constante. En las etiquetas case, debe usar INT_MAX en su lugar.

Esto es muy molesto pero oigo que C++ 11 solucionará esto.

10

Pre C++ 0x, definitivamente. INT_MIN y INT_MAX son expresiones constantes integrales; numeric_limits<int>::min() y numeric_limits<int>::max() no lo son. <climits> es C++ estándar, y a menos que se trate de plantillas (donde no se sabe si es int o long), realmente no hay razón para preocuparse por la solución demasiado complicada. (También: si está plantillas de escritura, no se olvide de que numeric_limits<int>::min() y numeric_limits<double>::min() representan completamente diferentes atributos, si desea que el valor mínimo posible, tendrá que numeric_limits<T>::is_integer ? numeric_limits<T>::min() : -numeric_limits<T>::max().)

+0

Agregaría que el argumento de expresión constante integral solo cuenta, si desea usar los valores en las plantillas. – Xeo

+0

@Xeo: Eso no es verdad. También importa cuando estás inicializando una clase estática. – MSalters

+0

@MSalters,?no se puede inicializar una clase estática integral sin una constante integral? – Nim

12

Las otras respuestas en su mayoría tienen la información correcta, pero parece que esto necesita actualización para C++ 11.

En C++ 11, std::numeric_limits<T>::min(), std::numeric_limits<T>::max() y std::numeric_limits<T>::lowest() están todos declararon constexpr, para que puedan ser utilizables en la mayor parte de los mismos contextos como INT_MIN y compañía. La única excepción en la que puedo pensar es en el procesamiento de cadenas en tiempo de compilación utilizando el token de stringificación #.

Esto significa que numeric_limits se puede utilizar para las etiquetas de caso, los parámetros de plantilla, etc., y se obtiene el beneficio de usar en el código genérico (trate de usar INT_MIN vs LONG_MIN en template<typename T> get_min(T t);).

C++ 11 también ofrece una solución al problema de James Kanze, agregando std::numeric_limits<T>::lowest(), que proporciona el valor finito más bajo para todos los tipos, en lugar del valor más bajo para tipos enteros y el valor positivo más bajo para flotación tipos de puntos

Cuestiones relacionadas