Подмножество идентификаторов — это типы VMD, называемые «v-типом». Это идентификаторы, которые представляют все типы данных препроцессора, которые VMD может анализировать. Это подмножество идентификаторов автоматически регистрируется и предварительно обнаруживается VMD. Каждый тип идентификатора начинается с приставки «BOOST_VMD_TYPE_».
Фактические типы:
- BOOST_VMD_TYPE_EMPTY представляет собой пустоту, т.е. "пустые данные"
- BOOST_VMD_TYPE_ARRAY, массив Boost PP
- BOOST_VMD_TYPE_LIST, список Boost PP
- BOOST_VMD_TYPE_SEQ, a Boost PP seq
- BOOST_VMD_TYPE_TUPLE, PP турпл
- BOOST_VMD_TYPE_IDENTIFIER, идентификатор
- BOOST_BMD_TYPE_NUMBER, число
- BOOST_VMD_TYPE_TYPE, сам тип
- BOOST_VMD_TYPE_SEQUENCE, последовательность
- BOOST_VMD_TYPE_UNKNOWN, неизвестный тип
Поскольку v-тип сам по себе является идентификатором, то конкретное ограничение на вход для тестирования точно такое же, как и для идентификаторов.
Ограничение заключается в том, что начальный входной символ, игнорируя любое белое пространство, пропущенное в качестве входа для тестирования, должен быть либо:
- символ идентификатора, т.е. буквенно-цифровой или подчеркивающий
- левая скобка кортежа
и если первый символ не является левой скобкой кортежа, остальные символы должны быть буквенно-цифровыми или подчеркиванием, пока не произойдет пространственный символ или конец ввода.
Если это не так, поведение не определено, и, скорее всего, произойдет ошибка предварительной обработки.
Макрос, используемый для тестирования определенного типа в VMD, называется BOOST_VMD_IS_TYPE. Макро принимает один параметр, вход для тестирования против.
Макро возвращает 1, если параметр является v-типом, в противном случае макрос возвращает 0.
V-тип также является идентификатором, который был зарегистрирован и предварительно обнаружен, поэтому вы также можете использовать функциональность VMD, которая работает с идентификаторами, для работы с V-типом в качестве идентификатора, если хотите.
Рассмотрим пример использования BOOST_VMD_IS_TYPE.
#include <boost/vmd/is_type.hpp>
BOOST_VMD_IS_TYPE(input)
returns:
if input = BOOST_VMD_TYPE_SEQ, 1
if input = BOOST_VMD_TYPE_NUMBER, 1
if input = SQUARE, 0
if input = BOOST_VMD_TYPE_IDENTIFIER DATA, 0 since there are tokens after the type
if input = %44, does not meet the constraint therefore undefined behavior
if input = ( BOOST_VMD_TYPE_EMPTY ), 0 since the macro begins with a tuple and this can be tested for
Для использования макроса BOOST_VMD_IS_TYPE используется общий заголовок:
#include <boost/vmd/vmd.hpp>
или включить конкретный заголовок:
#include <boost/vmd/is_type.hpp>