Какова цель boost::to_string
(нашел в boost/exception/to_string.hpp
) и чем он отличается от boost::lexical_cast<std::string>
а также std::to_string
?
std::to_string
, доступно с C ++ 11, работает на основные числовые типы в частности. Он также имеет std::to_wstring
вариант.
Он предназначен для получения тех же результатов, которые sprintf
было бы.
Вы можете выбрать эту форму, чтобы избежать зависимости от внешних библиотек / заголовков.
boost::lexical_cast<std::string>
работает на любой тип, который может быть вставлен в std::ostream
, включая типы из других библиотек или ваш собственный код.
Для распространенных типов существуют оптимизированные специализации с общей формой, напоминающей:
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;
}
Вы можете выбрать эту форму, чтобы использовать большую гибкость типов ввода в общих функциях или для создания std::string
из типа, который вы знаете, не является фундаментальным числовым типом.
boost::to_string
не задокументировано напрямую и, по-видимому, предназначено для внутреннего использования. Его функциональность ведет себя как lexical_cast<std::string>
не std::to_string
,
Есть больше различий: boost :: lexical_cast работает немного по-другому при преобразовании double в строку. Пожалуйста, рассмотрите следующий код:
#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;
}
Результаты
$ ./to_string
std::to_string(1.79769e+308) == 179769313486231570814527423731704356798070600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
boost::lexical_cast<std::string>(1.79769e+308) == 1.7976931348623157e+308
Как видите, в улучшенной версии используются экспоненциальные обозначения (1.7976931348623157e + 308), тогда как std :: to_string печатает каждую цифру и шесть десятичных знаков. Один может быть более полезным, чем другой для ваших целей. Лично я считаю версию буста более читабельной.