Я пытаюсь преобразовать строку как "ABC10DEF20"
в массив ["ABC", 10, "DEF", 20]
используя Boost Spirit. Я не уверен, что «undelimited» является правильным термином, но я хочу разбить его на границы целых и нецелых чисел, а не разбивать его пробелами или другими символами-разделителями.
Я придумал код вроде:
std::string search_str = "ABC10DEF20";
std::vector<boost::variant<std::string, unsigned int> > v;
std::string::const_iterator iter = search_str.begin();
std::string::const_iterator last = search_str.end();
bool r = parse(iter, last,
+(+(char_ - digit)|uint_),
v);
Для ввода "ABC10DEF20"
это приводит к [ 65, 66, 67, 10, 68, 69, 70, 20 ]
(без строк, только целые числа и компоненты ASCII строковой части, хранящиеся в целых числах). Для ввода "10"
я получил [ 10 ]
как предполагалось.
Из результатов видно, что вы сопоставляете отдельные символы, а не строки и целые целые числа без знака.
Не уверен, что это все исправит, но попробуйте:
bool r = parse(iter, last,
+(+(+char_ - digit)|uint_),
v);
(Обратите внимание на добавленный +
до char_
.)
Тип v
может потребоваться изменить, чтобы быть:
std::vector<boost::variant<std::vector<char>, unsigned int> > v;
и вам, возможно, придется исправить результат. Не очень знаком с Boost Spirit; Бьюсь об заклад, есть лучший, более чистый способ.
Окончательное решение:
Измените выражение анализа для использования:
+(as_string[+(char_ - digit)]|uint_)
Других решений пока нет …