Читаю главу в доках про возаращаемое грамматикой значение при парсинге через qi::parse().
Пишут, что если я парсю череду значений, типа
double_ >> "," >> char_ >> ".";
То возвращаемое значение должно быть tuple<A,B> - подобного типа, то есть std::pair<double,char> например. Или boost::fusion-аналог.
Я вот чё хочу понять - как оно там внутри, во время матчинга грамматики, возвращает результат? Оно смотрит на плоскую память, и ходит по ней указателем, шагая на разное количество байт, в зависимости от различных типов? То есть, например std::pair<double,char> - это что-то типа
struct S
{
double first;
char second;
// в случае добавления ещё каких-то параметров:
//int third;
//float fourth;
};
Я предполагаю, что spirit берёт указатель на экземпляр S. Продвигаясь по грамматике, он записывает очередное заматченное значение, используя указатель нужного типа и шагает на sizeof(TYPE) дальше. Если кусок грамматики отвалился, он откатывается на точку, где начинается отвалившаяся ветка и продолжает пытаться матчить другую ветку.
Как-то так?