以下列程式為例
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/arithmetic/add.hpp>
#include <boost/preprocessor/control/while.hpp>
#define p(d,s) BOOST_PP_TUPLE_ELEM(2,1,s)
#define op(d,s)(\
BOOST_PP_ADD_D(d,BOOST_PP_TUPLE_ELEM(2,0,s),BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2,1,s))),\
BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2,1,s)))
#define op1(d,s) (BOOST_PP_TUPLE_ELEM(2,0,BOOST_PP_WHILE_##d(p,op,s)),BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2,1,s)))
#define x(n) BOOST_PP_TUPLE_ELEM(2,0,BOOST_PP_WHILE(p,op1,(n,n)))
x(2)//展開為3
/*
最外層的BOOST_PP_WHILE若沒指定d值,會代換為BOOST_PP_WHILE_1
x(2)
|
v
BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_1(p,op1,(2,2))//要傳給p跟op1的d值為2
|
v
BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_3(p,op,(BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_2(p,op,(2,2)),1))
| ^
| 外層的p
v
BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_3(p,op,(3,1))
|
v
3
d值的作用就是在此次的WHILE展開中
決定下一個BOOST_PP_WHILE可以使用的值
*/
x(3)//展開為7
/*
x(3)
|
v
BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_1(p,op1,(3,3))
|
v
BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_4(p,op,
(BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_3(p,op,(BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_2(p,op,(3,3)),2)),1))
*/
---------------------以下指定d值--------------------------------------------------
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/arithmetic/add.hpp>
#include <boost/preprocessor/control/while.hpp>
#define p(d,s) BOOST_PP_TUPLE_ELEM(2,1,s)
#define op(d,s)(\
BOOST_PP_ADD_D(d,BOOST_PP_TUPLE_ELEM(2,0,s),BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2,1,s))),\
BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2,1,s)))
#define op1(d,s) (BOOST_PP_TUPLE_ELEM(2,0,BOOST_PP_WHILE_##d(p,op,s)),BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2,1,s)))
#define x(n,d) BOOST_PP_TUPLE_ELEM(2,0,BOOST_PP_WHILE_##d(p,op1,(n,n)))
x(3,2)//展開為7
/*
d的初始值給2,所以直接從BOOST_PP_WHILE_2開始
x(3,2)
|
v
BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_2(p,op1,(3,3))
|
v
BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_5(p,op,
(BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_4(p,op,(BOOST_PP_TUPLE_ELEM_2_0 BOOST_PP_WHILE_3(p,op,(3,3)),2)),1))
*/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.247.105
※ 編輯: loveflames 來自: 220.130.247.105 (03/11 16:14)