Использование препроцессора boost для сравнения токенов

Я нашел страницу, на которой объясняется, как можно реализовать сравнение идентификатора и маркера с помощью директив препроцессора c. Это можно сделать с помощью некоторых макросов, например:

#define COMPARE_foo(x) x
#define COMPARE_bar(x) x
#define PRIMITIVE_COMPARE(x, y) IS_PAREN \
 ( \
 COMPARE_ ## x ( COMPARE_ ## y) (())  \
 )

PRIMITIVE_COMPARE(foo, bar) // expands to 0
PRIMITIVE_COMPARE(bar, bar) // expands to 1

Какой IS_PAREN проверяет, полностью ли он расширен или нет (что происходит только тогда, когда два макроса различаются из-за окрашивание в синий цвет).

Сейчас ищу аналогичную команду в Boost Preprocessor. Я хочу иметь список допустимых типов макроса, и если макрос вызывается с одним из этого типа, он расширяется до того, что он должен, иначе он ничего не делает. Мой псевдокод выглядит примерно так:

#define ACCEPTED_TYPE (float)(int)(string)
#define Macro(x) // If one of accepted type do a otherwise do nothing

Если препроцессор boost не имеет точного решения, как вы предлагаете упростить реализацию.


person motam    schedule 31.01.2016    source источник
comment
Окрашивание в синий цвет не является общепринятым термином. Трюк работает, потому что применение макроса к себе таким особым образом создает рекурсивное расширение макроса, которое пропускается, потому что рекурсия макроса запрещена. В любом случае, было бы лучше сначала, а не в последнюю очередь, изложить вашу конкретную проблему и разработать ее дальше. Если вы ограничитесь методом из связанного блога, это будет проблемой XY.   -  person Potatoswatter    schedule 31.01.2016
comment
Если вам не нужно, чтобы список ACCEPTED_TYPE легко варьировался, и вы используете достаточно современный компилятор и Boost 1.60 (это много если), это может сработать, но если ваш вариант использования похож на то, что я сделал здесь, есть лучший подход, использующий специализации шаблонов.   -  person llonesmiz    schedule 31.01.2016
comment
Я не думаю, что это еще в Boost, но насколько я помню, VMD может вам очень помочь.   -  person chris    schedule 31.01.2016
comment
@Potatoswatter Спасибо за совет. Я задам вопрос более четко в будущем. Но я думаю, что термин синий цвет также используется в стандарте C.   -  person motam    schedule 31.01.2016
comment
@chris Это в Boost с 1.60.   -  person llonesmiz    schedule 31.01.2016
comment
@cv_and_he, О, я не уверен, что поймал этот релиз. Спасибо.   -  person chris    schedule 31.01.2016
comment
@MohsenTamiz Слово «синий» не встречается в стандартах C или C++, и я впервые столкнулся с этой фразой. Википедия очень сбита с толку, говоря, что существовал стандарт C 1972 года; стандартизация произошла в 1980-х годах. (Ах, ха-ха, это на странице 1972 связанной книги.) Тем не менее, спасибо за ссылку.   -  person Potatoswatter    schedule 31.01.2016
comment
@cv_and_he Как вы сказали, это работает очень хорошо, когда типы известны во время компиляции. Но если у меня есть класс шаблона, который пользователь моей библиотеки может определить с другим типом, могу ли я позволить пользователю зарегистрировать его новый тип и сделать то же самое для нового типа шаблона?   -  person motam    schedule 03.02.2016