精華區beta CSSE 關於我們 聯絡資訊
※ 引述《jeunder (omega~ oh my god)》之銘言: : 假設有個函數 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, 以及那兩個令人昏頭的運算子 # 與 ##, 似乎 : 是一種可能的解決方案? 只是想知道怎麼做啊... 好吧,以下: int table[N]; template<int i> int f(); template<int i> void function init_f() { table[i-1] = f<i-1>(); if(i) init_f<i-1>(); } void main() { init_f<N>(); cin >> n; cout << table[n]; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.222.173.29