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:'两个' :未声明的标识符
这是否意味着我的编译器的最大递归深度已达到,因此宏ELEM_ID_OP
和MYFUNC
不再展开?或者是否在Boost.PP中有一个实现细节阻止它工作?有解决方法吗?
我使用VC ++ 2013,如果有帮助的话。
答案 0 :(得分:4)
Boost.Preprocessor
无法执行嵌套SEQ_FOR_EACH
。如果你使用了一个不错的预处理器,你可以使用可以进行任意嵌套的混沌(虽然只有SEQ_FOR_EACH
不需要它,因为序列长度在混沌中是不受限制的。)
对于这么简单的事情,你可以使用VC ++直接用
这样的东西#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define A(id, value) const int id = value; B
#define B(id, value) const int id = value; A
#define A0
#define B0
#define C(bseq) CAT(A bseq, 0)
C(
(zero, 0)
(one, 1)
(two, 2)
)
#undef A
#undef B
#undef A0
#undef B0
#undef C