2012-03-21 22 views
6

En el encabezado de C++ 11, hay tres funciones nuevas para la conversión entre el número y la cadena.Conversión numérica

std::string std::to_string(unsigned long long); 
std::string std::to_string(long double); 
std::string std::to_string(long long); 

La primera pregunta: ¿por qué solo hay 3 funciones? ¿Qué pasa con int simple o unsigned int, etc.?

La segunda pregunta: ¿por qué to_string no arroja la excepción en el siguiente código?

long double x = std::numeric_limits<long double>::quiet_NaN(); 
std::string i = std::to_string(x); 
long double c = std::stold(i); // i = "1.#QNAN" 

Y la tercera pregunta: ¿por qué c es igual a 1.0?

+0

conjetura salvaje, pero tal vez solo existan tres porque el entero más pequeño y los tipos de punto flotante se pueden convertir fácilmente a ellos sin pérdida de información. – Collin

Respuesta

5
  • "Mientras se produce el comportamiento descrito, hacer lo que por favor .."

    Todos los tipos numéricos intrínsecas puede ser convertido implícitamente a cualquiera unsigned long long, long double o long long y todavía mantienen la precisión requerida, por lo tanto, no son necesarias más sobrecargas.

    La norma dice que se deben definir las siguientes funciones, aunque una confirmación de lib para la norma es libre de hacer "lo que quiera" siempre que tenga el mismo comportamiento descrito.


  • ¿Por qué debe lanzar una excepción?

    std::numeric_limits<long double>::quiet_NaN(); es un valor válido, y std::to_string (T) se describe en el estándar para producir el mismo comportamiento que llamar sprintf con el apropiado serie-formato.

§ 21.5/6                   conversiones numéricas

  • string to_string(int val);
  • string to_string(unsigned val);
  • string to_string(long val);
  • string to_string(unsigned long val);
  • string to_string(long long val);
  • string to_string(unsigned long long val);
  • string to_string(float val);
  • string to_string(double val);
  • string to_string(long double val);

    ..

Devuelve:

  • Cada función devuelve un objeto de cadena que contiene la representación de caracteres del valor de su argumento de que sería generada por llamando sprintf (buf, FMT, val) con un especificador de formato de "% d", " % u", "% ld", "% lu", "% LLD", "% LLU", "% f", "% f", o "% Lf ", respectivamente, donde buf designa una memoria intermedia de caracteres interna de tamaño suficiente.

  • Por lo compilador es igual a c1.0?

    La conversión debe producir un valor P NaN si el valor de i es representación de cadena de NaN (que no contiene ningún dígito).

    Si no se puede encontrar una conversión adecuada, se describe la función para arrojar invalid_argument.

    MSVC rendirá 1.#QNAN al intentar convertir a un std::numeric_limits<long double>::quiet_NaN();std::string.

    Al utilizar std::stold buscará el primer carácter de espacio en blanco ninguno, y luego usar tantos dígitos como se encuentra (en este caso sólo 1), por lo tanto, c será igual a 1.0 después de la llamada a la función.

+0

visual studio 2010 – innochenti

+0

i = "1. # QNAN"; – innochenti

+0

@innochenti ver respuesta actualizada. –

1

me parece todo el paquete en mi copia de la norma:

string to_string(int val); 
string to_string(unsigned val); 
string to_string(long val); 
string to_string(unsigned long val); 
string to_string(long long val); 
string to_string(unsigned long long val); 
string to_string(float val); 
string to_string(double val); 
string to_string(long double val); 

Tal vez su compilador no ha ejecutado la totalidad de ellos todavía?

La funcionalidad se describe como

devoluciones: Cada función devuelve un objeto de cadena que contiene la representación de caracteres del valor de su argumento de que se generaría llamando sprintf(buf, fmt, val) con un especificador de formato de "%d", "%u", "%ld" , "%lu", "%lld", "%llu", "%f", "%f", o "%Lf", respectivamente, donde buf designa una memoria intermedia de caracteres interna de tamaño suficiente.

Como se supone que es una envoltura alrededor de sprintf es probable que se decidió no lanzar ninguna excepción, como sprintf no.

+0

Estoy usando C++ visual y msvc2010. – innochenti

+0

Creo que las funciones adicionales se agregaron al estándar en una etapa avanzada, porque las personas como usted las pidieron. VC2010 fue lanzado antes de eso. –

+0

Extraño. Me pregunto por qué no envolvieron std :: ostringstream o std :: istringstream? – Robinson

Cuestiones relacionadas