13 апреля 2012

Boost.Lexical cast

Знаете ли вы, что boost::lexical_cast не имеет такого важного параметра как локаль? По-моему, это ни в какие ворота. Всем функциям, которые работают со строками в Boost-е, можно указать локаль, а тут - такой вот финт! Всегда используется глобальная локаль.

Например, добавляем в код безобидный оператор:
std::locale::global(std::locale("")); // системная локаль, например русская

А теперь представьте, как будет работать код, зарытый где-то глубоко в недрах какой-нибудь библиотеки:
HttpResponse.AddHeader("Content-Length", boost::lexical_cast<std::string>(Length)); // внезапно добавляется разделитель тысячных разрядов

По-моему, использовать boost::lexical_cast в библиотеках надо категорически запретить. А в своем коде - только с BOOST_LEXICAL_CAST_ASSUME_C_LOCALE.