Проверьте следующий макрос:
#define INPUT (char, "microsecond", "us")(int, "millisecond", "ms")(int, "second", "s")(int, "minute", "min")(float, "hour", "h")
Цель состоит в том, чтобы добавить двойные скобки вокруг каждого кортежа, в результате чего:
((char, "microsecond", "us"))((int, "millisecond", "ms"))((int, "second", "s"))((int, "minute", "min"))((float, "hour", "h"))
Теперь я использую следующие макросы для выполнения этой работы:
#define ADD_PAREN_1(A, B, C) ((A, B, C)) ADD_PAREN_2
#define ADD_PAREN_2(A, B, D) ((A, B, C)) ADD_PAREN_1
#define ADD_PAREN_1_END
#define ADD_PAREN_2_END
#define OUTPUT0 ADD_PAREN_1 INPUT
#define OUTPUT1 BOOST_PP_CAT( OUTPUT0, _END )
Результат выглядит следующим образом:
OUTPUT0 в порядке:
((char, "microsecond", "us")) ((int, "millisecond", C)) ((int, "second", "s")) ((int, "minute", C)) ((float, "hour", "h")) ADD_PAREN_2
Но когда вызывается BOOST_PP_CAT, результатом OUTPUT1 является:
float
Я не понимаю такого поведения. Любые подсказки?
Примечание. Я использую Visual Studio 2010.