Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Identifier modifiers

Boost , Chapter 1. The Variadic Macro Data Library 1.9 , Macros with modifiers

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Модификаторы идентификаторов являются необязательными параметрами, которые определяют набор идентификаторов для поиска, чтобы искать определенный идентификатор, а не просто какой-либо идентификатор.

Usage with BOOST_VMD_IS_IDENTIFIER

После того, как мы зарегистрировали и предварительно обнаружили идентификатор, мы можем проверить, является ли идентификатор конкретным идентификатором, используя 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) // returns 1 only if 'some_input is 'yellow', else returns 0
BOOST_VMD_IS_IDENTIFIER(some_input,yellow,blue) // returns 1 only if 'some_input is 'yellow' or 'blue', else returns 0
BOOST_VMD_IS_IDENTIFIER(some_input,(yellow,green)) // returns 1 if 'some_input' is 'yellow' or 'green', else returns 0
BOOST_VMD_IS_IDENTIFIER(some_input,red)
   // always returns 0, even if 'some_input' is 'red' since 'red' has not been pre-detected

в

BOOST_VMD_IS_IDENTIFIER(some_input) // returns 1 if 'some_input' is 'red' since 'red' has been registered

Если вы вызываете 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) // returns 1 only if 'some_input' is 1 or 3 or 5, else returns 0
BOOST_VMD_IS_IDENTIFIER(some_input,BOOST_VMD_TYPE_TUPLE,BOOST_VMD_TYPE_LIST,59)
   // returns 1 only if 'some_input is the v-type BOOST_VMD_TYPE_TUPLE or the v-type BOOST_VMD_TYPE_LIST or 59, else returns 0
Usage with BOOST_VMD_ELEM

При использовании конкретного модулятора фильтра 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 рассматриваются как идентификаторы модификаторов для соответствия.


PrevUpHomeNext

Статья Identifier modifiers раздела Chapter 1. The Variadic Macro Data Library 1.9 Macros with modifiers может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Macros with modifiers ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 19:00:04/0.00724196434021/0