[心得] 簡介一下boost.preprocessor

看板C_and_CPP (C/C++)作者 (咕啾咕啾魔法陣)時間8年前 (2017/12/29 12:03), 編輯推噓2(204)
留言6則, 2人參與, 8年前最新討論串1/1
以前在板上提過幾次,但沒有多作介紹 這個是為了簡化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 ; 最後提一下,其實還有一種換行展開,不過這裡沒舉出來 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.173.58.226 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1514520225.A.207.html

12/29 12:22, 8年前 , 1F
這在meta-programming真的是很好用的工具,不過我得說
12/29 12:22, 1F

12/29 12:23, 8年前 , 2F
這也是我接手的專案裡面,看過最多「為了用而用」的
12/29 12:23, 2F

12/29 12:23, 8年前 , 3F
的boost library裡面出現率最高的 XD
12/29 12:23, 3F

12/29 12:24, 8年前 , 4F
另外一個類似情形是Signal2...(/facepalm)
12/29 12:24, 4F

12/29 12:48, 8年前 , 5F
因為太炫才為用而用對吧
12/29 12:48, 5F

12/29 13:08, 8年前 , 6F
我覺得是 XD 也算是技術宅團隊的特徵啦 (?)
12/29 13:08, 6F
文章代碼(AID): #1QHRwX87 (C_and_CPP)
文章代碼(AID): #1QHRwX87 (C_and_CPP)