Boost
C++ Libraries
...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
lexical_cast<int8_t>("127") throw bad_lexical_cast?
int8_t
is a typedef to char or signed
char. Lexical conversion to
these types is simply reading a byte from source but since the source
has more than one byte, the exception is thrown. Please use other
integer types such as int
or short int.
If bounds checking is important, you can also call boost::numeric_cast: numeric_cast<int8_t>(lexical_cast<int>("127"));
lexical_cast<unsigned char>("127")
throw bad_lexical_cast?
int
or short int.
If bounds checking is important, you can also call boost::numeric_cast: numeric_cast<unsigned char>(lexical_cast<int>("127"));
lexical_cast<std::string> of an int8_t
or uint8_t not do what
I expect?
lexical_cast<std::string>(static_cast<int>(n));
ios_base::skipws flag of an underlying stream object.
It breaks my operator>>
that works only in presence of this flag. Can you remove code that resets
the flag?
operator>>
more general. Read a good C++ book, study std::sentry
and ios_state_saver.
std::cout << boost::lexical_cast<unsigned int>("-1");
does not throw, but outputs 4294967295?
boost::lexical_cast
has the behavior of std::stringstream,
which uses num_get
functions of std::locale
to convert numbers. If we look at the Programming languages — C++,
we'll see, that num_get
uses the rules of scanf
for conversions. And in the C99 standard for unsigned input value
minus sign is optional, so if a negative number is read, no errors
will arise and the result will be the two's complement.
boost::lexical_cast<int>(L'A'); outputs
65 and boost::lexical_cast<wchar_t>(L"65"); does not throw?
boost::lexical_cast sees single wchar_t character as unsigned short.
It is not a boost::lexical_cast
mistake, but a limitation of compiler options that you use.
boost::lexical_cast<double>("-1.#IND"); throws boost::bad_lexical_cast?
"-1.#IND"
is a compiler extension, that violates standard. You shall input
"-nan", "nan", "inf"
, "-inf" (case
insensitive) strings to get NaN and Inf values. boost::lexical_cast<string> outputs "-nan",
"nan", "inf", "-inf"
strings, when has NaN or Inf input values.
boost::lexical_cast?
boost::iterator_range
for conversion or lexical_cast
overload with two parameters. For example, if you whant to convert
to int two characters
from a string str,
you shall write lexical_cast<int>(make_iterator_range(str.data(), str.data() + 2));
or lexical_cast<int>(str.data(),
2);.