编码如下或在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_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
来说是错误的做法吗?
1条答案
按热度按时间11dmarpk1#
不能应用一个宏两次。该宏已“涂成蓝色”。
使用不同的名称,或者探索boost如何使用
_R
宏(如BOOST_PP_SEQ_FOR_EACH_R
)来实现它。