2016-12-07 4 views
4

Из тестирования я могу получить qi::uint_parser<int>() то же самое, что и qi::uint_. Они анализируют целые числа от 0 до UINT_MAX.Что должно быть qi :: uint_parser <int>() Разбор точно?

Что я не понимаю, так это то, что qi::uint_parser требует, чтобы std::numeric_limits<T>::max() был действительным для числового базового типа T. Я не уверен, должен ли я предположить, что qi::uint_parser<int>() должен анализировать целые числа от 0 до std::numeric_limits<int>::max() не std::numeric_limits<unsigned int>::max(). Или это требование не имеет никакого отношения к диапазону парсера?

ответ

0

Я думаю, что это дублирует How to write a boost::spirit::qi parser to parse an integer range from 0 to std::numeric_limits<int>::max()?, а также вопрос, который я помню, просматривая список рассылки.

Поскольку это, по-видимому, не задокументировано, вы протестировали?

Или это требование не имеет никакого отношения к диапазону парсера?

Я ожидаю, что это будет последний. Я ожидаю, что тип атрибута говорит об атрибуте, а не синтаксическом анализаторе. Анализатор парсера, распространение атрибута присваивает атрибуту. Разделение проблем.

Распространение атрибута может выполнять любые неявные преобразования, которые будут иметь языки C++. Это на самом деле не отличается от использования unsigned в scanf("%d") или чтение без знака Int с помощью std::istream: См How to read unsigned int variables from file correctly, using ifstream?

Я бы ожидать, что это все, чтобы быть правдой, потому что C++ объединяет в себе основные язык значения

  • оплаты только за то, что вам нужно
  • программист знает, что он делает.

Фактически, это корень проблемы: Spirit определяет qi::int_, qi::uint_ и друзей. Если вы скопируете пользовательские комбинации, используя базовый шаблон qi::[u]int_parser<>, вы сообщаете компилятору «Я знаю, что делаю».

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Все это не является авторитетным. Я даже не проверял код/​​документы. Я думаю, что это вопрос документации, который лучше задавать на mailing list

+1

Как насчет этого бита из [docs] (http://www.boost.org/doc/libs/1_62_0/libs/spirit/doc/ HTML/дух/й/ссылка/цифровой/uint.html)? «Все числовые парсеры проверяют условия переполнения на основе типа T, с которым был создан соответствующий uint_parser <>. Если разобранное число переполняет этот тип, синтаксический анализ не выполняется. Обратите внимание, что проверка переполнения не основана на типе поставляемого атрибут, но зависит исключительно от параметра шаблона T. " То, как я читаю, это то, что T повлияет на диапазон, который он будет анализировать. Я читаю это неправильно? –

Смежные вопросы