c++ boost std tostring lexical-cast

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 .