c++ BOOST_PP_SEQ_FOR_EACH无法按预期展开

e4yzc0pl  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(116)

编码如下或在godbolt上。

#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/seq/seq.hpp>
#include <boost/preprocessor/seq/transform.hpp>
#include <boost/preprocessor/seq/elem.hpp>

#define APPLY_MACRO(state, macro, elem) macro(elem)

// (type)(name) --> type
#define PARAM_TYPE(seq) \
    BOOST_PP_SEQ_ELEM(0, seq)

// ((type1)(name1))((type2)(name2))...((typeN)(nameN)) -> type1, type2, ... , typeN
#define PARAMS_TYPE_ENUM(seq) \
    BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(APPLY_MACRO, PARAM_TYPE, seq))

#define PARAMS_TYPE_ENUM2(r, data, seq) \
    BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(APPLY_MACRO, PARAM_TYPE, seq))

PARAMS_TYPE_ENUM (   ((typename)(T)) ((bool)(b)) ) // test -> typename, bool
PARAMS_TYPE_ENUM2(,, ((typename)(T)) ((bool)(b)) ) // test -> typename, bool

BOOST_PP_SEQ_FOR_EACH( APPLY_MACRO, PARAMS_TYPE_ENUM, ( ((typename)(T)) ((bool)(b)) ) ) // cannot expand
BOOST_PP_SEQ_FOR_EACH( PARAMS_TYPE_ENUM2, _, ( ((typename)(T)) ((bool)(b)) ) ) // typename, bool

BOOST_PP_SEQ_FOR_EACH(macro, data, seq)将扩展到

macro(r, data, a) macro(r, data, b) macro(r, data, c)

我想出了这个APPLY_MACRO作为BOOST_PP_SEQ_FOR_EACH中的“macro”,并使用真实的的宏(Eidogg. PARAM_TYPEPARAMS_TYPE_ENUM),它将Seq中的一个元素作为“data”。
但是倒数第二行不能像预期的那样扩展。它扩展到

APPLY_MACRO(1, PARAM_TYPE, (typename)(T)), APPLY_MACRO(2, PARAM_TYPE, (bool)(b))

最后一行是传统方式,按预期扩展。
为什么倒数第二行不能扩展为“typename, bool“?APPLY_MACRO + PARAMS_TYPE_ENUM作为data对于BOOST_PP_SEQ_FOR_EACH来说是错误的做法吗?

11dmarpk

11dmarpk1#

不能应用一个宏两次。该宏已“涂成蓝色”。

BOOST_PP_SEQ_FOR_EACH( APPLY_MACRO, ...
# APPLY_MACRO is expanded inside PP_SEQ_FOR_EACH
> APPLY_MACRO(..., PARAMS_TYPE_ENUM, elem) PARAMS_TYPE_ENUM(elem)
> PARAMS_TYPE_ENUM(elem)
> BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(APPLY_MACRO, ....
# You can't expand again same macro.
> APPLY_MACRO(...)

使用不同的名称,或者探索boost如何使用_R宏(如BOOST_PP_SEQ_FOR_EACH_R)来实现它。

相关问题