Номер в VMD является предварительной обработкой pp-число, ограниченное числом Boost PP. Это интегральное буквальное число от 0 до 256. Форма числа не содержит ведущих нулей. Приемлемыми в качестве цифр являются:
0
127
33
254
18
но не:
033
06
009
00
Как видно из объяснения идентификатора, число является лишь небольшим подмножеством всех возможных идентификаторов, для которых VMD внутренне предоставляет макросы регистрации для своего использования и макросы предварительного обнаружения для своего использования. Следовательно, конкретное ограничение на вход для тестирования точно такое же, как и для идентификаторов.
Ограничение заключается в том, что начальный входной символ, игнорируя любое белое пространство, пропущенное в качестве входа для тестирования, должен быть либо:
- символ идентификатора, т.е. буквенно-цифровой или подчеркивающий
- левая скобка кортежа
и если первый символ не является левой скобкой кортежа, остальные символы должны быть буквенно-цифровыми или подчеркиванием, пока не произойдет пространственный символ или конец ввода.
Если это не так, поведение не определено, и, скорее всего, произойдет ошибка предварительной обработки.
Макрос, используемый для тестирования любого числа в VMD, называется BOOST_VMD_IS_NUMBER. Макро принимает один параметр, вход для тестирования против.
Макро возвращает 1, если параметр является числом Boost PP, в противном случае макрос возвращает 0.
Библиотека Boost PP имеет большой функционал для работы с числами, поэтому, как только вы используете VMD для анализа / тестирования числа, вы можете использовать Boost PP для работы с этим числом различными способами. VMD не пытается дублировать функциональность чисел в библиотеке Boost PP.
Любой номер также является идентификатором, который был зарегистрирован и предварительно обнаружен, поэтому вы также можете использовать функцию VMD, которая работает с идентификаторами, для работы с номером в качестве идентификатора, если хотите.
Рассмотрим пример использования BOOST_VMD_IS_NUMBER.
#include <boost/vmd/is_number.hpp>
BOOST_VMD_IS_NUMBER(input)
returns:
if input = 0, 1
if input = 44, 1
if input = SQUARE, 0
if input = 44 DATA, 0 since there are tokens after the number
if input = 044, 0 since no leading zeros are allowed for our Boost PP numbers
if input = 256, 1
if input = 257, 0 since it falls outside the Boost PP number range of 0-256
if input = %44, does not meet the constraint therefore undefined behavior
if input = 44.0, does not meet the constraint therefore undefined behavior
if input = ( 44 ), 0 since the macro begins with a tuple and this can be tested for
Для использования макроса BOOST_VMD_IS_NUMBER используется общий заголовок:
#include <boost/vmd/vmd.hpp>
или включить конкретный заголовок:
#include <boost/vmd/is_number.hpp>