BOOST_PP_DEDUCE_D
マクロは BOOST_PP_WHILE
の構築状態を手動で推論する。
Usage
BOOST_PP_DEDUCE_D()
Remarks
このマクロは深い展開における自動再帰の使用を避けるためにある。 いくつかのプリプロセッサでは、そのような深さでの自動再帰は非効率的となり得る。 これは接尾辞 _D
を持ったマクロの実行に直接使用されるためのものではない。例えば:
BOOST_PP_ADD_D(BOOST_PP_DEDUCE_D(), x, y)
もしこのような文脈でこのマクロが使われた場合、_D
マクロは失敗するだろう。 _D
マクロは渡されたパラメータ d
を直接、BOOST_PP_DEDUCE_D()
が展開されるのを邪魔して、結合する。 さらに言えば、このマクロをさきの例のような状況で使用するのは無意味である。 効率を得るにはすでに遅すぎるからだ。
See Also
Requirements
Header: <boost/preprocessor/control/deduce_d.hpp>
Sample Code
#include <boost/preprocessor/arithmetic/add.hpp>
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/arithmetic/sub.hpp>
#include <boost/preprocessor/control/deduce_d.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#define RANGE(first, last) \
BOOST_PP_REPEAT( \
BOOST_PP_INC( \
BOOST_PP_SUB(last, first) \
, \
RANGE_M, \
(first, BOOST_PP_DEDUCE_D()) \
) \
/**/
#define RANGE_M(z, n, data) \
RANGE_M_2( \
n, \
BOOST_PP_TUPLE_ELEM(2, 0, data), \
BOOST_PP_TUPLE_ELEM(2, 1, data) \
) \
/**/
#define RANGE_M_2(n, first, d) \
BOOST_PP_COMMA_IF(n) BOOST_PP_ADD_D(d, n, first) \
/**/
RANGE(5, 10) // 5, 6, 7, 8, 9, 10 に展開される