Макрос BOOST_VMD_ELEM, который по умолчанию просто возвращает элемент последовательности, имеет использование, при котором он может возвращать как элемент, так и оставшуюся часть последовательности после элемента, или даже только оставшуюся часть последовательности после элемента самостоятельно. Это предлагает форму расщепления последовательности на конкретном элементе. При использовании для возврата оставшейся части последовательности оставшиеся данные могут впоследствии снова рассматриваться как последовательность VMD.
Для этого используется другой набор дополнительных модификаторов, который будет называться «расщепляющиеся модифферы». Эти модификаторы:
- BOOST_VMD_RETURN_AFTER, который возвращает как информацию о элементе, так и остальную последовательность после элемента в виде двухэлементного набора
- BOOST_VMD_RETURN_ONLY_AFTER, который возвращает только остальную часть последовательности после указанного элемента
- BOOST_VMD_RETURN_NO_AFTER - это внутренний дефолт, который возвращает только сам элемент. Он никогда не должен быть указан, но может быть использован для переопределения предыдущего модификатора расщепления, указанного в качестве необязательного параметра.
Если в качестве дополнительных параметров для BOOST_VMD_ELEM указано более одного из модификаторов расщепления, то действует последний указанный.
Модификаторы разделения BOOST_VMD_RETURN_NO_AFTER и BOOST_VMD_RETURN_AFTER работают либо с модификаторами возвратного типа, либо с модификаторами фильтрации, если они используются. Модификатор разделения BOOST_VMD_RETURN_ONLY_AFTER работает с модификатором фильтрации, если он используется, и любые модификаторы возвратного типа будут проигнорированы. Опциональные модификаторы могут возникать в любом порядке после требуемых параметров для BOOST_VMD_ELEM.
Если BOOST_VMD_RETURN_AFTER действует и элемент не найден, либо потому, что номер элемента находится вне диапазона для последовательности, либо потому, что фильтрация не соответствует типу элемента, кортеж все равно будет возвращен, но оба его элемента будут пустыми.
#include <boost/vmd/elem.hpp>
#define BOOST_VMD_REGISTER_ANAME (ANAME)
#define A_SEQUENCE (1,2,3) 46 (list_data1,BOOST_PP_NIL) BOOST_VMD_TYPE_SEQ ANAME
BOOST_VMD_ELEM(2,A_SEQUENCE) will return '(list_data1,BOOST_PP_NIL)'
BOOST_VMD_ELEM(2,A_SEQUENCE,BOOST_VMD_RETURN_NO_AFTER) will return '(list_data1,BOOST_PP_NIL)'
BOOST_VMD_ELEM(2,A_SEQUENCE,BOOST_VMD_RETURN_AFTER) will return '((list_data1,BOOST_PP_NIL),BOOST_VMD_TYPE_SEQ ANAME)'
BOOST_VMD_ELEM(2,A_SEQUENCE,BOOST_VMD_RETURN_ONLY_AFTER) will return 'BOOST_VMD_TYPE_SEQ ANAME'
BOOST_VMD_ELEM(5,A_SEQUENCE) will return emptiness
BOOST_VMD_ELEM(5,A_SEQUENCE,BOOST_VMD_RETURN_NO_AFTER) will return emptiness
BOOST_VMD_ELEM(5,A_SEQUENCE,BOOST_VMD_RETURN_AFTER) will return '(,)'
BOOST_VMD_ELEM(5,A_SEQUENCE,BOOST_VMD_RETURN_ONLY_AFTER) will return emptiness
Комбинирование разделительных модификаторов с модификаторами возвратного типа:
BOOST_VMD_ELEM(2,A_SEQUENCE,BOOST_VMD_RETURN_AFTER,BOOST_VMD_RETURN_TYPE) will return '((BOOST_VMD_TYPE_LIST,(list_data1,BOOST_PP_NIL)),BOOST_VMD_TYPE_SEQ ANAME)'
Комбинирование разделительных модификаторов с фильтрующими модификаторами:
BOOST_VMD_ELEM(2,A_SEQUENCE,BOOST_VMD_RETURN_AFTER,BOOST_VMD_TYPE_LIST) will return '((list_data1,BOOST_PP_NIL),BOOST_VMD_TYPE_SEQ ANAME)'