Ответ:Тип<int8_t>— от<typedef>до<char>или<signedchar>. Лексическое преобразование в эти типы - это просто чтение байта из источника, но поскольку источник имеет более одного байта, исключение бросается. Пожалуйста, используйте другие типы целых чисел, такие как<int>или<shortint>. Если проверка границ важна, вы также можете позвонить.<boost::numeric_cast>:<numeric_cast<int8_t>(lexical_cast<int>("127"));>
Ответ:Лексическое преобразование в любой тип шара — это просто чтение байта из источника. Но так как источник имеет более одного байта, исключение бросается. Пожалуйста, используйте другие целые типы, такие как<int>или<shortint>. Если проверка границ важна, вы также можете позвонить<boost::numeric_cast>:<numeric_cast<unsignedchar>(lexical_cast<int>("127"));>
Вопрос:Что делать (42) из<int8_t>или<uint8_t>не так, как я ожидаю?
Ответ:Обратите внимание, что int8_t и uint8_t на самом деле являются проводниками и отформатированы как таковые. Чтобы избежать этого, сначала отбрасывайте на целочисленный тип:<lexical_cast<std::string>(static_cast<int>(n));>
Вопрос:Реализация всегда сбрасывает флаг<ios_base::skipws>базового объекта потока. Он ломает мой<operator>>>, который работает только при наличии этого флага. Можете ли вы удалить код, который сбрасывает флаг?
Вопрос:Почему<std::cout<<boost::lexical_cast<unsignedint>("-1");>не бросает, а выводит 4294967295?
Ответ:<boost::lexical_cast>имеет поведение<std::stringstream>, которое использует<num_get>функции<std::locale>для преобразования чисел. Если мы посмотрим на языки программирования — C++, мы увидим, что<num_get>использует правила<scanf>для конверсий. И в стандарте C99 для неподписанного входного значения минус знак является необязательным, поэтому, если прочитано отрицательное число, не возникнет ошибок и результатом будет дополнение двух.
Ответ:Если вы используете старую версию Visual Studio или компилируете код с флагом /Zc:wchar_t,<boost::lexical_cast>видит одиночный<wchar_t>символ<unsignedshort>. Это не ошибка<boost::lexical_cast>, а ограничение параметров компилятора, которые вы используете.
Ответ:<"-1.#IND">является расширением компилятора, что нарушает стандарт. Вы должны ввести<"-nan">,<"nan">,<"inf">,<"-inf">(случай нечувствительный) строки, чтобы получить значения NaN и Inf.<boost::lexical_cast<string>>выводит<"-nan">,<"nan">,<"inf">,<"-inf">строки, когда имеет значения ввода NaN или Inf.
Вопрос:Как быстрее всего преобразовать ненулевую законченную строку или подстроку, используя<boost::lexical_cast>?
Ответ:Используйте<boost::iterator_range>для преобразования или<lexical_cast>перегрузки с двумя параметрами. Например, если вы хотите преобразовать в<int>два символа из строки<str>, вы должны написать<lexical_cast<int>(make_iterator_range(str.data(),str.data()+2));>или<lexical_cast<int>(str.data(),2);>.
Статья Frequently Asked Questions раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 19. Boost.Lexical_Cast 1.0 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.