У меня есть следующий набор макросов:
macro_1(p1)
macro_2(p1, p2)
macro_3(p1, p2, p3)
etc.
Теперь я хочу сделать еще один универсальный макрос, который будет сравнивать с предыдущими, и я пытаюсь сделать это так:
#define macro_x(...) macro_ ## BOOST_PP_VARIADIC_SIZE(__VA_ARGS__) (__VA_ARGS__)
Идея заключается в том, что BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)
оценивает правильное количество параметров, которые затем превращаются в правильный макрос.
Но, к сожалению, я только что узнал, что BOOST_PP_VARIADIC_SIZE()
будет оцениваться после того, как будет соединен с macro_
, что приводит к нежелательному коду macro_BOOST_PP_VARIADIC_SIZE
,
Есть ли способ, которым я могу сначала оценить BOOST_PP_VARIADIC_SIZE
а затем объединить с macro_
?
Это уже сделано для вас BOOST_PP_OVERLOAD
:
#define macro_x(...) BOOST_PP_OVERLOAD(macro_, __VA_ARGS__)(__VA_ARGS__)
Ваша причина не работает в том, что для расширения макроса необходима задержка. Хотя легко определить свой собственный, BOOST_PP_CAT
уже существует:
#define CAT_(a, b) a##b
#define CAT(a, b) CAT_(a, b)
Других решений пока нет …