Рассмотрим следующий код:
{
std::string input = "FFFFFFF";
int result = 0;
auto itBeg = input.cbegin();
auto itEnd = input.cend();
if(!bsq::parse(itBeg, itEnd, bsq::int_parser<int, 16>(), result) || itBeg != itEnd)
{
throw std::exception();
}
std::cout << input << " means " << result << std::endl;
}
{
std::string input = "FFFFFFFF";
int result = 0;
auto itBeg = input.cbegin();
auto itEnd = input.cend();
if(!bsq::parse(itBeg, itEnd, bsq::hex, result) || itBeg != itEnd)
{
throw std::exception();
}
std::cout << input << " means " << result << std::endl;
}
{
std::string input = "FFFFFFFF";
int result = 0;
auto itBeg = input.cbegin();
auto itEnd = input.cend();
if(!bsq::parse(itBeg, itEnd, bsq::int_parser<int, 16>(), result) || itBeg != itEnd)
{
throw std::exception();
}
std::cout << input << " means " << result << std::endl;
}
первый разбор отлично работает на 0xFFFFFFF (примечание, 7 шестнадцатеричных цифр)
второй работает нормально на 0xFFFFFFFF (8 шестнадцатеричных цифр)
третий терпит неудачу, и я не могу понять, почему. разве int_parser<T, 16>
по сути то же самое, что bsq :: hex?
Жить на Coliru
третий терпит неудачу, и я не могу понять, почему
Вы используете подписанный парсер и достигаете границы ширины шрифта. Измените это на:
bsq::uint_parser<unsigned int, 16>(), result)
разве
int_parser<T, 16>
по сути такой же, какbsq::hex
?
Нет.
Документация Говорит, что boost::spirit::qi::hex
будут
Разобрать целое число без знака с помощью [..] основание 16
Других решений пока нет …