【问题标题】:Are two-dimensional sequences possible with Boost.Preprocessor?Boost.Preprocessor 可以实现二维序列吗?
【发布时间】:2014-11-04 15:41:46
【问题描述】:

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_OPMYFUNC 不再扩展?或者 Boost.PP 中是否有一个实现细节阻止它工作?有解决办法吗?

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

【问题讨论】:

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


    【解决方案1】:

    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
    

    【讨论】:

    • 想象我经历了定义足够多的宏来处理序列中的 256 个条目的麻烦,你提出的技术真的能够处理嵌套序列吗?
    • @iFreilicht 以上将适用于任意长度的序列。
    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多