[心得] 简介一下boost.preprocessor

楼主: loveflames (咕啾咕啾魔法阵)   2017-12-29 12:03:41
以前在板上提过几次,但没有多作介绍
这个是为了简化preprocess-time metaprogramming
一.资料型态
资料型态有四,举四个范例
#define TUPLE (a,b,c)
#define SEQUENCE (a)(b)(c)
#define ARRAY (3, (a, b, c))
#define LIST (a, (b, (c, BOOST_PP_NIL)))
四种资料型态有各自的元函数,各型态之间可互相转换
tuple跟sequence我用比较多,所以接下来的范例都使用这两种资料型态
二.内部参数
在举范例之前,先来说明几个内部使用的macro参数,初学者最容易卡在这里
d:while内部展开使用,下一个可用值
z:repeat内部展开使用,下一个可用值
s:sequence fold内部展开使用,下一个可用值
r:for内部展开使用,下一个可用值
n:repeat内部展开使用,目前迭代值,从0开始计数
在官方网页会看到一些D、Z、S、R的后缀名称
呼叫该版本会比较快,但我觉得为了脑细胞着想,不要管这些内部数字
最多写成间接呼叫(使用macro传过来的d、z、s、r值)
三.数值计算
BOOST_PP_WHILE(p, op, s)
s是初始状态,例如一个tuple或sequence
当p为1时以op产生下一个状态,以此类推,直到p为0为止
http://codepad.org/uhY7ewVU
上面这个是(1,2) -> (2,1) -> (3,0)
四.产生多个类似的code片段
A.条件展开
BOOST_PP_FOR(s, p, op, m)
s是初始状态,例如一个tuple或sequence
当p为1时展开m,再以op产生下一个状态,以此类推,直到p为0为止
http://codepad.org/f5bJc2dt
展开成int x2; int x1;
最后状态为(3,0),故不再展开
B.根据现有资料展开
BOOST_PP_SEQ_FOR_EACH(m, data, seq)
从seq依序取出元素,连同data一起代入m展开
http://codepad.org/ZuJcrnrR
展开成int x1 ; int x2 ;
C.指定展开次数,从0开始依序递增
BOOST_PP_REPEAT(count, m, data)
展开count次,data代入m展开
这个也可以配合资料型态,依序取出元素
http://codepad.org/bAdBKhUh
展开成int x0 ; int x1 ; int x2 ;
最后提一下,其实还有一种换行展开,不过这里没举出来
作者: Killercat (杀人猫™)   2017-12-29 12:22:00
这在meta-programming真的是很好用的工具,不过我得说这也是我接手的专案里面,看过最多“为了用而用”的的boost library里面出现率最高的 XD另外一个类似情形是Signal2...(/facepalm)
楼主: loveflames (咕啾咕啾魔法阵)   2017-12-29 12:48:00
因为太炫才为用而用对吧
作者: Killercat (杀人猫™)   2017-12-29 13:08:00
我觉得是 XD 也算是技术宅团队的特征啦 (?)

Links booklink

Contact Us: admin [ a t ] ucptt.com