繁体   English   中英

BOOST_PP_SEQ_FOR_EACH 无法按预期展开

[英]BOOST_PP_SEQ_FOR_EACH cannot expand as expected

代码如下或在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 ”,并使用真正的宏(例如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作为dataBOOST_PP_SEQ_FOR_EACH的错误做法吗?

您不能将一个宏应用两次。 宏被“涂成蓝色”。

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 如何使用BOOST_PP_SEQ_FOR_EACH_R_R宏来实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM