Последовательности Boost.PP ограничены 256 элементами. Чтобы обойти это, я хочу использовать двумерные последовательности или последовательность последовательностей, которые будут определены следующим образом:
((0)(1)(2)...(255))((256)(257))
Теперь, чтобы предоставить BOOST_PP_SEQ_FOR
-подобный алгоритм, я хочу вложить два из них следующим образом:
//Inner loop
#define ELEM_ID_OP(_, func, elem) func(elem)
#define FOR_ELEM(func, seq) \
BOOST_PP_SEQ_FOR_EACH(ELEM_ID_OP, func, seq)
//Outer loop
#define SEQ_ID_OP(_, func, seq) FOR_ELEM(func, seq)
#define FOR_SEQ(func, multiseq) \
BOOST_PP_SEQ_FOR_EACH(SEQ_ID_OP, func, multiseq)
//Testing function
#define MYFUNC(arg) \
const int arg = 0;
FOR_ELEM(MYFUNC, (Zero)(One)(Two)) //works like a charm
FOR_SEQ(MYFUNC, ((zero)(one)(two))) //doesn't :(
На втором я получаю несколько ошибок о необъявленных идентификаторах:
ошибка C2065: «ELEM_ID_OP»: необъявленный идентификатор
ошибка C2065: «MYFUNC»: необъявленный идентификатор
ошибка C2065: «ноль»: необъявленный идентификатор
ошибка C2065: «один»: необъявленный идентификатор
ошибка C2065 : 'two' : необъявленный идентификатор
Означает ли это, что максимальная глубина рекурсии моего компилятора достигнута, поэтому макросы ELEM_ID_OP
и MYFUNC
больше не раскрываются? Или в Boost.PP есть деталь реализации, которая мешает этому работать? Есть ли обходной путь для этого?
Я использую VC++2013, если это поможет.