看板 CSSE 關於我們 聯絡資訊
假設有個函數 int f(int), 利用此函數計算數列的值 f(0), f(1), ..., f(N-1). 如果 f(n) 的計算很耗費時間, 並且給定 n 值, f(n) 值就可以確定了. 通常我們 會建立表格陣列, 以便之後的多次引用, 不需再重複耗費計算能量 int table[N]; for(int i = 0; i < N; ++i) table[i] = f(i); 又假設 f(n) 值其實是可以在 compile time 計算出來的, 利用整數模板來計算, 像這樣 f<0>::value, f<1>::value, ..., f<N-1>::value. 這樣一來, 數列的計 算可以在 compile time 完成, 但是產生了新的問題. 原本 f(n) 的計算, n 值 可以在 run time 才決定, 但利用整數模板之後, f<n>::value 的 n 值卻得在 compile time 就決定了, 也就是說, 做以下的事情是不被允許的 cin >> n; cout << ( f<n>::value ); 因為整數模板的整數值無法延到 run time 才決定, 最簡單的解決方法就是做苦工 #define F(n) f<(n)>::value int table[] = { F(0), F(1), ..., F(N-1) }; 但是這樣做就覺得很醜, 每次要改變 N 值的範圍, 就得在編輯器複製貼上. C++語 言似乎缺乏在 source code level 的 for loop (或者說我可以稱此為 coding time 的 for loop), 而在 compile time 的 for loop (整數模板), 卻又被過度限制, 想在 compile time 填寫陣列表格也似乎做不到...? 講到這裡, 講了好多, 好像我是來教導些什麼的? 其實我是來發問問題的 :p 要怎樣才能漂亮的解決以上問題, 在 run time 之前就把表格填好, 並且可在 run time 以動態決定的索引來存取這個表格? 附註1: 只是單純的想討論這個問題, 想知道怎麼做, 至於該不該去這麼做, 或者 適不適當, 並非此處討論的重點. 附註2: 我知道可以用程式寫工具來幫助自己寫程式, 利用工具來轉換或者產生程 式碼, 但是我只想侷限在語言本身的機制, 尋求看看是否有漂亮的解答? 附註3: 突然想到了巨集 #define, 以及那兩個令人昏頭的運算子 # 與 ##, 似乎 是一種可能的解決方案? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.219.228 ※ 編輯: jeunder 來自: 61.230.219.228 (06/27 18:09)