精華區beta CSSE 關於我們 聯絡資訊
※ 引述《jeunder (omega~ oh my god)》之銘言: : 抱歉, 這樣做沒有解答到我的提問喔. : ※ 引述《reader (讀者)》之銘言: : : 只是想知道怎麼做啊... 好吧,以下: : : int table[N]; : : template<int i> int f(); : : template<int i> void function init_f() { : ^^^^^^^^ 這個 function 是? 你擴充的東西? @,@? 不小心多打的。 : : table[i-1] = f<i-1>(); : : if(i) init_f<i-1>(); : ^^^^^^^^^^^^^^^^^^^^ : 這一行會把 compiler 害死. : 因為要處理 init_f<N>(), init_f<N-1>(), ... (無止盡). : 編譯器不知道何時該停止, 而 if(i) 這樣的敘述只有在執行時期才有影響力. : 現在的編譯器都還是很笨, 像這個情況通常都要另外定義 init_f<1> 當成編譯 : 時期遞迴的終止條件, 像這樣 : template<> void init_f<1>() { : table[0] = f<0>(); : } 嗯,是需要用 init_f<1>, 這錯已經犯過幾次,還是沒注意。 : : } : : void main() { : : init_f<N>(); : ^^^^^^^^^^^^ : 原本的問題是希望設定 table 可以在編譯時期完成, 像這樣在執行時期呼叫函數, : 並非我原本的期望. 雖然這樣也可以運作良好, 但是我原來的問題就是在很龜毛情 : 境下發問的, 在極端注重程式執行效率的情況下, 希望盡可能的把運算工作在編譯 : 時期完成. 但運算是在編譯時期完成的。 只有陣列設定是在執行時期完成,因為要在編譯時期設定陣列 內容,基本上是沒有辦法的。 用 template 的遞迴也做不到的,應該就是做不到了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.222.173.29