Модификаторы индексов могут использоваться с макросом BOOST_VMD_ELEM при использовании модификаторов идентификаторов. Модификаторы индексов принимают два значения:
- BOOST_VMD_RETURN_INDEX возвращает индекс в виде числа, начиная с 0, конкретного модификатора идентификатора, который соответствует, как часть вывода макроса BOOST_VMD_ELEM. Если какой-либо конкретный модификатор идентификатора не совпадает, возвращайте пустоту как часть вывода. Номер индекса определяется исключительно порядком, в котором модификаторы идентификаторов указаны в качестве дополнительных параметров для BOOST_VMD_ELEM, будь то отдельно в качестве отдельных дополнительных параметров или в качестве набора модификаторов идентификаторов.
- BOOST_VMD_RETURN_NO_INDEX, не возвращайте индекс как часть вывода. Это значение по умолчанию и должно использоваться только для переопределения значения BOOST_VMD_RETURN_INDEX, если оно указано.
BOOST_VMD_RETURN_INDEX сообщает программисту, какой из модификаторов идентификатора сопоставил данные элемента с индексом. Некоторые макропрограммисты находят это более полезным для целей логики макроразветвления, чем разветвление с использованием фактического имени самого идентификатора.
При указании модификатора индекса BOOST_VMD_RETURN_INDEX и модификатора идентификатора вместе с модификатором фильтра BOOST_VMD_TYPE_IDENTIFIER выход BOOST_VMD_ELEM становится набором из двух элементов. Первый элемент кортежа - это соответствующий элемент, а последний элемент кортежа - это индекс, начинающийся с 0, соответствующего модификатора идентификатора. Если элемент не совпадает, оба элемента кортежа пусты.
Если также указан модификатор расщепления BOOST_VMD_RETURN_AFTER, то на выходе получается набор из трех элементов. Первый элемент кортежа — это соответствующий элемент, второй элемент кортежа — остальная часть последовательности после соответствующего элемента, а последний элемент кортежа — числовой индекс. Если элемент не совпадает, то все три элемента кортежа пусты.
Если модификаторы идентификаторов и модификатор фильтра BOOST_VMD_TYPE_IDENTIFIER не указаны в качестве дополнительных параметров, то при указании BOOST_VMD_RETURN_INDEX он игнорируется. Если модификатор разделения BOOST_VMD_RETURN_ONLY_AFTER указан, он также игнорируется.
Давайте посмотрим, как это работает:
#include <boost/vmd/elem.hpp>
#define BOOST_VMD_REGISTER_ANAME (ANAME)
#define BOOST_VMD_REGISTER_APLACE (APLACE)
#define BOOST_VMD_REGISTER_ACOUNTRY (ACOUNTRY)
#define BOOST_VMD_DETECT_ANAME_ANAME
#define BOOST_VMD_DETECT_APLACE_APLACE
#define A_SEQUENCE (1,2,3) ANAME (1)(2) 46
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER) will return 'ANAME'
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,APLACE,ACOUNTRY) will return emptiness
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,BOOST_VMD_RETURN_INDEX,APLACE,ACOUNTRY) will return (,)
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,BOOST_VMD_RETURN_INDEX,ANAME,APLACE,ACOUNTRY) will return '(ANAME,0)'
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,BOOST_VMD_RETURN_INDEX,(APLACE,ACOUNTRY,ANAME)) will return '(ANAME,2)'
Используется с разделительными модификаторами:
#include <boost/vmd/elem.hpp>
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,BOOST_VMD_RETURN_INDEX,APLACE,ACOUNTRY,BOOST_VMD_RETURN_AFTER) will return (,,)
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,BOOST_VMD_RETURN_INDEX,ANAME,APLACE,ACOUNTRY,BOOST_VMD_RETURN_AFTER) will return '(ANAME,(1)(2) 46,0)'
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,BOOST_VMD_RETURN_INDEX,(APLACE,ACOUNTRY,ANAME),BOOST_VMD_RETURN_AFTER) will return '(ANAME,(1)(2) 46,2)'
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,BOOST_VMD_RETURN_INDEX,(APLACE,ACOUNTRY,ANAME),BOOST_VMD_RETURN_ONLY_AFTER) will return '(1)(2) 46'