Проверка на равенство Boost PP выглядит как
# define NOT_EQUAL_I(x, y) CAT(NOT_EQUAL_CHECK_, NOT_EQUAL_ ## x(0, NOT_EQUAL_ ## y))
# define NOT_EQUAL_CHECK_NIL 1
# define NOT_EQUAL_CHECK_NOT_EQUAL_0(c, y) 0
# define NOT_EQUAL_CHECK_NOT_EQUAL_1(c, y) 0
# define NOT_EQUAL_CHECK_NOT_EQUAL_2(c, y) 0
# define NOT_EQUAL_CHECK_NOT_EQUAL_3(c, y) 0
# define NOT_EQUAL_0(c, y) IIF(c, NIL, y(1, NIL))
# define NOT_EQUAL_1(c, y) IIF(c, NIL, y(1, NIL))
# define NOT_EQUAL_2(c, y) IIF(c, NIL, y(1, NIL))
# define NOT_EQUAL_3(c, y) IIF(c, NIL, y(1, NIL))
, который основан на том факте, что макрос в этой ситуации расширяется за один раз.
Однако другое решение легко продумать и, кажется, стоит меньше (место):
#define EQ_0_0 ,
#define EQ_1_1 ,
#define EQ_2_2 ,
#define EQ_3_3 ,
#define SECOND(_,x,...) x
#define PARSE(...) __VA_ARGS__
#define EQ(x,y) PARSE(SECOND PARSE() (0 EQ_##x##_##y 1, 0 ))
Так почему же Boost выбирает первую форму, а не вторую? Какие товары и недостатки у них?