Модификаторы идентификаторов являются необязательными параметрами, которые определяют набор идентификаторов для поиска, чтобы искать определенный идентификатор, а не просто какой-либо идентификатор.
После того, как мы зарегистрировали и предварительно обнаружили идентификатор, мы можем проверить, является ли идентификатор конкретным идентификатором, используя BOOST_VMD_IS_IDENTIFER и модификаторы идентификаторов. Мы делаем это, передав опциональный параметр(ы) BOOST_VMD_IS_IDENTIFER. Опциональный параметр(ы) - это либо один набор возможных идентификаторов, которые мы пытаемся совместить, либо сами индивидуальные идентификаторы как отдельные параметры.
Используя опциональный параметр(ы) с BOOST_VMD_IS_IDENTIFER, мы спрашиваем не только, является ли наш вход каким-либо из зарегистрированных идентификаторов, но и является ли он одним из ряда предварительно обнаруженных идентификаторов.
Пример:
#include <boost/vmd/is_identifier.hpp>
#define BOOST_VMD_REGISTER_yellow (yellow)
#define BOOST_VMD_REGISTER_green (green)
#define BOOST_VMD_REGISTER_blue (blue)
#define BOOST_VMD_REGISTER_red (red)
#define BOOST_VMD_DETECT_yellow_yellow
#define BOOST_VMD_DETECT_green_green
#define BOOST_VMD_DETECT_blue_blue
BOOST_VMD_IS_IDENTIFIER(some_input,yellow)
BOOST_VMD_IS_IDENTIFIER(some_input,yellow,blue)
BOOST_VMD_IS_IDENTIFIER(some_input,(yellow,green))
BOOST_VMD_IS_IDENTIFIER(some_input,red)
в
BOOST_VMD_IS_IDENTIFIER(some_input)
Если вы вызываете BOOST_VMD_IS_IDENTIFIER с необязательным параметром(ами) ссылка возвращает только 1, если вход совпадает с одним идентификатором(ами) факультативных параметров и идентификатором, который он соответствует, был зарегистрирован и предварительно обнаружен.
Оба номера VMD и v-типы являются подтипами идентификаторов, поэтому вы также можете использовать их в качестве модификаторов идентификаторов. Вам не нужно регистрировать или предварительно обнаруживать номера VMD или v-types, поскольку VMD уже сделала это для вас.
В качестве примера использования номеров VMD или v-типов в качестве модификаторов идентификаторов с BOOST_VMD_IS_IDENTIFIER:
BOOST_VMD_IS_IDENTIFIER(some_input,1,3,5)
BOOST_VMD_IS_IDENTIFIER(some_input,BOOST_VMD_TYPE_TUPLE,BOOST_VMD_TYPE_LIST,59)
При использовании конкретного модулятора фильтра BOOST_VMD_TYPE_IDENTIFIER В качестве дополнительного параметра BOOST_VMD_ELEM мы просим конкретный элемент последовательности, если он является идентификатором VMD. С этим конкретным фильтрующим модификатором BOOST_VMD_TYPE_IDENTIFIER Мы можем использовать модификаторы идентификаторов, чтобы запросить определенный элемент последовательности, если он соответствует одному из наших модификаторов идентификаторов. Если конкретный модификатор фильтра BOOST_VMD_TYPE_IDENTIFIER не используется, то все модификаторы идентификаторов игнорируются.
Синтаксис для определения модификаторов идентификаторов с использованием BOOST_VMD_ELEM точно такой же, как и эквивалентная функция макроса BOOST_VMD_IS_IDENTIFIER, описанная ранее. Дополнительные параметры в виде идентификаторов могут быть заданы либо по одному количеству раз, либо один раз как часть тюпа. Для идентификатора, найденного в качестве элемента последовательности для сопоставления с одним из этих возможных идентификаторов, возможные идентификаторы должны быть как зарегистрированы, так и предварительно обнаружены.
Поскольку модификаторы фильтров, которые являются v-типами, также являются идентификаторами, если вы хотите использовать v-типы в качестве модификаторов идентификаторов, вы должны использовать форму, которая помещает все модификаторы идентификаторов в качестве части тюпа. В противном случае любые v-типы, определенные по отдельности как необязательные параметры, рассматриваются как фильтрующие модификаторы и никогда не рассматриваются как идентификаторные модификаторы. Цифры VMD также являются идентификаторами и могут использоваться в качестве модификаторов идентификаторов, но в этом случае номера VMD в качестве модификаторов идентификаторов не должны быть частью тюпа.
Посмотрим, как это работает:
#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 46 BOOST_VMD_TYPE_SEQ ACOUNTRY
BOOST_VMD_ELEM(1,A_SEQUENCE) will return 'ANAME'
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,ANAME,APLACE,ACOUNTRY) will return 'ANAME'
BOOST_VMD_ELEM(1,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,(APLACE,ACOUNTRY,ANAME)) will return 'ANAME'
BOOST_VMD_ELEM(4,A_SEQUENCE) will return 'ACOUNTRY'
BOOST_VMD_ELEM(4,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER) will return 'ACOUNTRY'
BOOST_VMD_ELEM(4,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,ACOUNTRY,ANAME)
will return emptiness since ACOUNTRY is not pre-detected
Давайте иллюстрируем случай, когда идентификаторы VMD могут быть представлены либо в качестве модификаторов фильтров, либо модификаторов идентификаторов.
Использование приведенной выше последовательности:
#include <boost/vmd/elem.hpp>
BOOST_VMD_ELEM(3,A_SEQUENCE) will return the BOOST_VMD_TYPE_SEQ type
BOOST_VMD_ELEM(3,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER)
will return the BOOST_VMD_TYPE_SEQ type since a type is an identifier
BOOST_VMD_ELEM(3,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,BOOST_VMD_TYPE_SEQ,BOOST_VMD_TYPE_TUPLE) will return emptiness
Последнее использование нашей макро возвращает пустоту, потому что если есть более одного типа, указанного в качестве дополнительного параметра, последний тип выбирается для фильтрации. Поскольку последний тип фильтрации типа - BOOST_VMD_TYPE_TUPLE, а наш четвертый элемент - v-type, а не tuple, пустота возвращается. Синтаксис не указывает фильтрацию с идентификаторами, как это может быть предполагается, поскольку BOOST_VMD_TYPE_SEQ и BOOST_VMD_TYPE_TUPLE не рассматриваются как модификаторы идентификаторов, а как дополнительные модификаторы фильтров.
Чтобы делать фильтрацию с идентификатором и делать это против различных типов, так как v-типы являются идентификаторами, мы должны использовать тупольную форму для указания наших модификаторов идентификаторов:
#include <boost/vmd/elem.hpp>
BOOST_VMD_ELEM(3,A_SEQUENCE,BOOST_VMD_TYPE_IDENTIFIER,(BOOST_VMD_TYPE_SEQ,BOOST_VMD_TYPE_TUPLE))
will return BOOST_VMD_TYPE_SEQ
Теперь BOOST_VMD_TYPE_SEQ и BOOST_VMD_TYPE_TUPLE рассматриваются как идентификаторы модификаторов для соответствия.