【发布时间】:2013-01-03 00:27:06
【问题描述】:
我如何编写一个类似于BOOST_PP_SEQ_ENUM 的宏,但处理空序列,即
#define SEQ (a)(b)
MY_BOOST_PP_SEQ_ENUM(SEQ) // expands to a,b
#define SEQ
MY_BOOST_PP_SEQ_ENUM(SEQ) // expands to nothing
【问题讨论】:
标签: c++ boost boost-preprocessor
我如何编写一个类似于BOOST_PP_SEQ_ENUM 的宏,但处理空序列,即
#define SEQ (a)(b)
MY_BOOST_PP_SEQ_ENUM(SEQ) // expands to a,b
#define SEQ
MY_BOOST_PP_SEQ_ENUM(SEQ) // expands to nothing
【问题讨论】:
标签: c++ boost boost-preprocessor
针对这个问题提出了一个解决方案here,命名为添加#define BOOST_PP_SEQ_ENUM_0。它被“没有空序列之类的东西”评论拒绝,但这似乎解决了我的问题。
【讨论】:
你只需要将SEQ定义为一个空序列:
#define SEQ ()
你可以直接使用BOOST_PP_SEQ_ENUM。
使用 G++ 4.7.1 和 VC 2010 与 Boost 1.47 一起工作。
【讨论】:
BOOST_PP_SEQ_ENUM(TAIL SEQ) 的事情,因此在 null 情况下序列最终为空。
你可以用这个:
#define PP_SEQ_ENUM(x) BOOST_PP_CAT(PP_SEQ_ENUM_0 x, _END)
#define PP_SEQ_ENUM_0(x) x PP_SEQ_ENUM_1
#define PP_SEQ_ENUM_1(x) , x PP_SEQ_ENUM_2
#define PP_SEQ_ENUM_2(x) , x PP_SEQ_ENUM_1
#define PP_SEQ_ENUM_0_END
#define PP_SEQ_ENUM_1_END
#define PP_SEQ_ENUM_2_END
这应该适用于任何大小的序列(甚至大于 256 的序列)
【讨论】: