作者reader (讀者)
看板CSSE
標題Re: [CPP] compile time 與 run time 之間的代溝
時間Mon Jun 27 20:30:34 2005
※ 引述《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