[英]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_TYPE
和PARAMS_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
的錯誤做法嗎?
您不能將一個宏應用兩次。 宏被“塗成藍色”。
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.