这里的one way使用Boost.Preprocessor,它不依赖于加速的任何其他部分:
#include <boost/preprocessor.hpp>
#define FOR_EACH_OP(r, data, elem) PTR(new List(elem,
#define DOUBLE_RPAREN(...)))
#define LIST(...) LIST_I(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
#define LIST_I(seq) \
BOOST_PP_SEQ_FOR_EACH(FOR_EACH_OP, /*empty*/, seq) \
PTR(new List(NULL,NULL)) \
BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(seq), DOUBLE_RPAREN, /*empty*/)
LIST(a) // PTR(new List(a, PTR(new List(NULL,NULL))))
LIST(a,b) // PTR(new List(a, PTR(new List(b, PTR(new List(NULL,NULL))))))
LIST
只是将争论变成了“PP序列”,它提供了一个方便的FOR_EACH
。对于每个参数,左边的部分都是建立起来的。然后添加NULL
部件。最后,根据给定的参数数量添加匹配的右括号。
声明:LIST()
将无法按预期工作,因为这是一个带有一个(空)参数的调用。
如果你真的对Boost过敏,你可以make simplified versions of these。例如,支持最多四个参数的一种方法:
#define CAT(_0, _1) CAT_I(_0, _1)
#define CAT_I(_0, _1) _0##_1
#define ARG5(_0, _1, _2, _3, _4, ...) _4
#define NARGS(...) ARG5(__VA_ARGS__, 4, 3, 2, 1,)
#define OVERLOAD(prefix, ...) CAT(prefix, NARGS(__VA_ARGS__))
#define ELEM(i, ...) CAT(ELEM_, i)(__VA_ARGS__,)
#define ELEM_0(_0, ...) _0
#define ELEM_1(_0, _1, ...) _1
#define ELEM_2(_0, _1, _2, ...) _2
#define ELEM_3(_0, _1, _2, _3, ...) _3
#define FOR_EACH(macro, ...) OVERLOAD(FOR_EACH_, __VA_ARGS__)(macro, __VA_ARGS__)
#define FOR_EACH_1(macro, ...) macro(ELEM(0, __VA_ARGS__))
#define FOR_EACH_2(macro, ...) FOR_EACH_1(macro, __VA_ARGS__) macro(ELEM(1, __VA_ARGS__))
#define FOR_EACH_3(macro, ...) FOR_EACH_2(macro, __VA_ARGS__) macro(ELEM(2, __VA_ARGS__))
#define FOR_EACH_4(macro, ...) FOR_EACH_3(macro, __VA_ARGS__) macro(ELEM(3, __VA_ARGS__))
#define REPEAT(n, macro) CAT(REPEAT_, n)(macro)
#define REPEAT_1(macro) macro()
#define REPEAT_2(macro) REPEAT_1(macro) macro()
#define REPEAT_3(macro) REPEAT_2(macro) macro()
#define REPEAT_4(macro) REPEAT_3(macro) macro()
#define FOR_EACH_MACRO(elem) PTR(new List(elem,
#define DOUBLE_RPAREN()))
#define LIST(...) LIST_I(NARGS(__VA_ARGS__), __VA_ARGS__)
#define LIST_I(n, ...) \
FOR_EACH(FOR_EACH_MACRO, __VA_ARGS__) \
PTR(new List(NULL,NULL)) \
REPEAT(n, DOUBLE_RPAREN)
LIST(a) // PTR(new List(a, PTR(new List(NULL,NULL))))
LIST(a,b) // PTR(new List(a, PTR(new List(b, PTR(new List(NULL,NULL))))))
是的,Boost.Preprocessor是一个很好的开始。 – chris
@chris,你能指点我一篇文章,说明我该怎么做?对于嵌入式平台,我宁愿不依赖于单个宏的增强。 –
你当然可以使用Boost.PP而无需Boost的其余部分。这些都是宏,所以除了你生成的代码之外,没有任何代码。 – chris