1) Парсеры Qi уже проверяют условия переполнения. Компонент парсера потерпит неудачу, если входные данные не будут представлены типом, которому должен соответствовать компонент. Например, int_parser<int32_t, 10>
завершится ошибкой для чисел, не помещающихся в 32-разрядное целое число со знаком.
Вы можете использовать синтаксический анализатор long_long
(то есть предопределенный 64-битный целочисленный синтаксический анализатор), только если определено BOOST_HAS_LONG_LONG
. Если у вас есть платформа, где это не так, вы все равно можете эмулировать 64-битное целое число, написав свой собственный тип оболочки, предоставляющий функциональность, ожидаемую для числовых парсеров Qi (см. здесь ), например:
struct my_64bit_int {
//...
};
typedef int_parser<my_64bit_int, 10> my_64bit_int_parser_type;
my_64bit_int_parser_type const my_64bit_int_parser;
и используйте его как:
my_64bit_int bigint;
parse(b, e, my_64bit_int_parser, bigint);
2) Вы не можете связывать перегруженные функции без помощи компилятора, т. Е. С учетом:
void AddEntry(int32_t);
void AddEntry(int64_t);
вам нужно явно привести указатель функции, если вы хотите связать для int32_t
:
phoenix::bind((void(*)(int32_t))&AddEntry, _1);
Ответ на sidenote: Нет. Альтернативный синтаксический анализатор всегда последовательно выполняет различные альтернативы в той же последовательности, как указано, останавливаясь, когда первый из этих совпадений. Его общая сложность составляет O(N)
, где N
- количество отдельных альтернатив (см. здесь ).