BOOST_PP_WHILE 宏表示一个循环结构。
用法
BOOST_PP_WHILE(pred, op, state)
参数
- pred
- 形式为 pred(d, state) 的二元谓词。此谓词由 BOOST_PP_WHILE 使用下一个可用迭代 d 和当前 state 展开。此谓词必须展开为 0 到 BOOST_PP_LIMIT_MAG 范围内的值。该结构继续循环,直到此谓词返回 0。当此谓词返回 0 时,BOOST_PP_WHILE 返回当前 state。
- op
- 形式为 op(d, state) 的二元操作。此操作由 BOOST_PP_WHILE 使用下一个可用迭代 d 和当前 state 展开。此宏反复应用于 state,每次产生一个新的 state,直到 pred 返回 0。
- state
- 初始状态。通常此参数是一个元组。
备注
此宏迭代
op(
d,
state),直到
pred(
d,
state) 为非零值。换句话说,展开为:
op(d, ... op(d, op(d, state)) ... )。
传递给 pred 和 op 的 d 值表示下一个可用迭代。其他具有 _D 后缀变体的宏在内部使用 BOOST_PP_WHILE——例如,BOOST_PP_ADD 和 BOOST_PP_ADD_D。使用这些 _D 版本并非严格必要,但将 d 值(传递给 pred 或 op 的值)传递给这些宏,可以使它们以最大效率重新进入 BOOST_PP_WHILE。
要直接使用此 d 值,而不是简单地将其传递给另一个宏,请参见 BOOST_PP_WHILE_d。
以前,此宏不能在 BOOST_PP_WHILE 内部递归使用。此限制已不再存在,因为库可以自动检测下一个可用迭代。
另请参见
需求
示例代码
#include <boost/preprocessor/arithmetic/add.hpp>
#include <boost/preprocessor/control/while.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#define PRED(n, state) BOOST_PP_TUPLE_ELEM(2, 1, state)
#define OP(d, state) \
OP_D( \
d, \
BOOST_PP_TUPLE_ELEM(2, 0, state), \
BOOST_PP_TUPLE_ELEM(2, 1, state) \
) \
/**/
#define OP_D(d, res, c) \
( \
BOOST_PP_ADD_D( \
d, \
res, \
BOOST_PP_DEC(c) \
), \
BOOST_PP_DEC(c) \
) \
/**/
#define SUMMATION(n) \
BOOST_PP_TUPLE_ELEM( \
2, 0, \
BOOST_PP_WHILE(PRED, OP, (n, n)) \
) \
/**/
SUMMATION(3) // expands to 6
SUMMATION(4) // expands to 10