BOOST_PP_FOR 宏表示一种通用的水平重复构造。
用法
BOOST_PP_FOR(state, pred, op, macro)
参数
- state
- 初始状态。
- pred
- 形式为 pred(r, state) 的二元谓词。此宏必须扩展为0到BOOST_PP_LIMIT_MAG范围内的整数。BOOST_PP_FOR重复扩展macro,直到此谓词返回非零值。此宏使用下一个可用的BOOST_PP_FOR重复次数和当前的state调用。
- op
- 形式为 op(r, state) 的二元运算。BOOST_PP_FOR使用下一个可用的BOOST_PP_FOR重复次数和当前的state扩展此运算。此宏重复应用于state,每次产生一个新的state,直到pred返回0。
- macro
- 形式为 macro(r, state) 的二元宏。BOOST_PP_FOR使用下一个可用的BOOST_PP_FOR重复次数和当前的state扩展此宏。BOOST_PP_FOR重复此宏,直到pred返回0。
备注
此宏扩展为以下序列:
macro(r, state) macro(r, op(r, state)) ... macro(r, op(r, ... op(r, state) ... ))
传递给pred、op和macro的r值表示下一个可用的BOOST_PP_FOR重复次数。其他具有_R后缀变体的宏在内部使用BOOST_PP_FOR——例如,BOOST_PP_LIST_FOR_EACH和BOOST_PP_LIST_FOR_EACH_R。使用这些_R版本并非严格必要,但将r值(传递给pred、op和macro)传递给这些宏,可以使它们以最大效率重新进入BOOST_PP_FOR。
要直接使用此r值,而不是简单地将其传递给另一个宏,请参见BOOST_PP_FOR_r。
以前,此宏不能在BOOST_PP_FOR内部递归使用。此限制不再存在,因为库可以自动检测下一个可用的BOOST_PP_FOR重复次数。
参见
需求
示例代码
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/comparison/not_equal.hpp>
#include <boost/preprocessor/repetition/for.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#define PRED(r, state) \
BOOST_PP_NOT_EQUAL( \
BOOST_PP_TUPLE_ELEM(2, 0, state), \
BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(2, 1, state)) \
) \
/**/
#define OP(r, state) \
( \
BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(2, 0, state)), \
BOOST_PP_TUPLE_ELEM(2, 1, state) \
) \
/**/
#define MACRO(r, state) BOOST_PP_TUPLE_ELEM(2, 0, state)
BOOST_PP_FOR((5, 10), PRED, OP, MACRO) // expands to 5 6 7 8 9 10