c++ - Boost.Preprocessor 是否可以实现二维序列?

标签 c++ visual-c++ boost macros boost-preprocessor

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 :(

在第二个问题上,我收到多个关于未声明标识符的错误:

error C2065: 'ELEM_ID_OP' : undeclared identifier
error C2065: 'MYFUNC' : undeclared identifier
error C2065: 'zero' : undeclared identifier
error C2065: 'one' : undeclared identifier
error C2065: 'two' : undeclared identifier

这是否意味着已达到编译器的最大递归深度,因此宏 ELEM_ID_OPMYFUNC 不再展开?或者在 Boost.PP 中是否有一个实现细节阻止了它的工作?有解决办法吗?

如果有帮助的话,我正在使用 VC++2013。

最佳答案

Boost.Preprocessor 不能执行嵌套的 SEQ_FOR_EACH。如果您使用的是像样的预处理器,则可以使用 Chaos,它可以执行此类任意嵌套(尽管 SEQ_FOR_EACH 不需要它,因为序列长度在 Chaos 中不受限制)。

对于如此简单的事情,您可以直接使用 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

关于c++ - Boost.Preprocessor 是否可以实现二维序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26739178/

相关文章:

c++ - Ubuntu 14.04 LTS x86-64bit Qt Creator 3.0.1 Kit Qt 4.8.6 程序启动失败。路径或权限错误?

c++ - 写文件过程崩溃!关闭

memory - boost::property_tree::ptree 的内存开销是多少

c++ - 如何从可变模板参数中删除元素?

boost - 如何在 CentOS7 中安装 boost-devel 1.59

c++ - 尝试初始化 wregex 对象时在 boost 的 regex_traits_defaults.hpp 中缩小转换警告

c++ - 在取地址的上下文中,哪个是最专业的函数模板?

c++ - Qt QDockWidget 增加了额外的边距空间

c++ - Windows 上的柯南声明设置未设置,已设置

c++ - nullptr 可以转换为 uintptr_t 吗?不同的编译器不同意