c++ - ¿Qué diferencia hay entre std:: to_string, boost:: to_string y boost:: lexical_cast<std:: string>?
tostring lexical-cast (2)
Hay más diferencias: boost :: lexical_cast funciona un poco diferente al convertir el doble en una cadena. Por favor considere el siguiente código:
#include <limits>
#include <iostream>
#include "boost/lexical_cast.hpp"
int main()
{
double maxDouble = std::numeric_limits<double>::max();
std::string str(std::to_string(maxDouble));
std::cout << "std::to_string(" << maxDouble << ") == " << str << std::endl;
std::cout << "boost::lexical_cast<std::string>(" << maxDouble << ") == "
<< boost::lexical_cast<std::string>(maxDouble) << std::endl;
return 0;
}
Resultados
$ ./to_string
std::to_string(1.79769e+308) == 179769313486231570814527423731704356798070600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
boost::lexical_cast<std::string>(1.79769e+308) == 1.7976931348623157e+308
Como puede ver, la versión boost utiliza notación exponencial (1.7976931348623157e + 308) mientras que std :: to_string imprime cada dígito y seis decimales. Uno puede ser más útil que otro para sus propósitos. Personalmente encuentro que la versión boost es más legible.
¿Cuál es el propósito de boost::to_string
(que se encuentra en boost/exception/to_string.hpp
) y en qué se diferencia de boost::lexical_cast<std::string>
y std::to_string
?
std::to_string
, disponible desde C ++ 11, trabaja específicamente en tipos numéricos fundamentales . También tiene una variante std::to_wstring
.
Está diseñado para producir los mismos resultados que sprintf
.
Puede elegir este formulario para evitar dependencias en bibliotecas / encabezados externos.
boost::lexical_cast<std::string>
funciona en cualquier tipo que se pueda insertar en un std::ostream
, incluidos los tipos de otras bibliotecas o su propio código.
Existen especializaciones optimizadas para tipos comunes, con la forma genérica similar a:
template< typename OutType, typename InType >
OutType lexical_cast( const InType & input )
{
std::stringstream temp_stream;
temp_stream << input;
OutType output;
temp_stream >> output;
return output;
}
Puede elegir este formulario para aprovechar una mayor flexibilidad de los tipos de entrada en funciones genéricas, o para producir una std::string
de un tipo que sepa que no es un tipo numérico fundamental.
boost::to_string
no está documentado directamente, y parece ser principalmente para uso interno. Su funcionalidad se comporta como lexical_cast<std::string>
, no std::to_string
.