BOOST_PP_WHILE_d
マクロは BOOST_PP_WHILE
のループ構築への再入を表す。
Usage
BOOST_PP_WHILE_ ## d(pred, op, state)
Arguments
-
d
: 利用可能な次のBOOST_PP_WHILE
の繰り返し。 -
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
に展開される。 このマクロはpred
が0
を返すまで、新しいstate
を生成しながら、繰り返しstate
に展開される。 -
state
: 初期状態。 この引数はたいてい タプル である。
Remarks
このマクロは pred(d, state)
が非 0 の間、op(d, state)
を繰り返す。 すなわち、次のように展開される:
op(d, ... op(d, op(d, state)) ... ).
ある時は、プリプロセッサのトークンペースト演算子ではなく、BOOST_PP_CAT
で文字列結合をする必要があるかもしれない。 この時は d
の値はマクロ呼び出しそのものである。 これを展開するには遅延が必要である。 このような状況での構文は次のようになるだろう。
BOOST_PP_CAT(BOOST_PP_WHILE_, d)(pred, op, state).
以前、 d
を直接 BOOST_PP_WHILE
につなげる (アンダースコアを挟まない) ことが可能だった。 これは現在ではサポートされていない。
See Also
Requirements
Header: <boost/preprocessor/control/while.hpp>
Sample Code
#include <boost/preprocessor/arithmetic/add.hpp>
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/array/elem.hpp>
#include <boost/preprocessor/array/size.hpp>
#include <boost/preprocessor/control/while.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#define PRED(d, data) BOOST_PP_TUPLE_ELEM(3, 1, data)
#define OP(d, data) \
OP_D( \
d, \
BOOST_PP_TUPLE_ELEM(3, 0, data), \
BOOST_PP_TUPLE_ELEM(3, 1, data), \
BOOST_PP_TUPLE_ELEM(3, 2, data) \
) \
/**/
#define OP_D(d, res, i, array) \
( \
BOOST_PP_ADD_D( \
d, res, \
BOOST_PP_ARRAY_ELEM(BOOST_PP_DEC(i), array)), \
BOOST_PP_DEC(i), \
array \
) \
/**/
#define ACCUMULATE_D(d, array) \
BOOST_PP_TUPLE_ELEM( \
3, 0, \
BOOST_PP_WHILE_ ## d( \
PRED, OP, \
(0, BOOST_PP_ARRAY_SIZE(array), array) \
) \
) \
/**/
#define ARRAY (4, (1, 2, 3, 4))
ACCUMULATE_D(1, ARRAY)// expands to 10