В чем разница между std :: to_string, boost :: to_string и boost :: lexical_cast & lt; std :: string & gt ;?

Какова цель boost::to_string (нашел в boost/exception/to_string.hpp) и чем он отличается от boost::lexical_cast<std::string> а также std::to_string?

17

Решение

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,

22

Другие решения

Есть больше различий: 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 печатает каждую цифру и шесть десятичных знаков. Один может быть более полезным, чем другой для ваших целей. Лично я считаю версию буста более читабельной.

0

По вопросам рекламы [email protected]