在 C 中,模板參數僅限於常數表達式,因為編譯器需要在編譯期間確定它們的值。常數表達式是那些可以僅根據編譯時可用的信息進行計算的表達式,不包括變數和函數呼叫。
在提供的程式碼中:
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
範本參數i 不是常數表達式,因為它的值取決於循環計數器變量,該變數在運行時評估。因此,編譯器無法在編譯時確定 i 的值並引發錯誤。
要在不修改庫介面的情況下實現您的目標,您可以使用一種名為 模板元程式設計。這是一種方法:
<code class="cpp">template<int I = 1> void modify_loop() { modify<I>(); modify_loop<I + 1>(); } // Call the recursive function with the starting value modify_loop<>();</code>
這種方法從一個模板函數modify_loop開始,它的預設值I設定為1。在函數內部,它用目前的I值呼叫modify,然後用I遞歸地呼叫自身增加。遞歸繼續,直到我達到所需的值 10。
要呼叫修改,其中 VAR 是函數計算的輸出,您可以使用稱為 表達式範本。下面是一個範例:
<code class="cpp">struct Func { template<typename T> T operator()(T arg) { return arg + 10; } }; constexpr auto VAR = Func()(); // Evaluate the function and store the result template<typename Value> void modify(Value arg) { ... } // Call modify with VAR as the argument modify(VAR);</code>
在此範例中,Func 結構定義了一個函數對象,該物件將其參數加 10。 VAR 變數儲存函數的輸出,modify 函數接受任何類型的模板參數。透過使用 VAR 實例化修改,您可以有效地將函數的結果作為參數傳遞。
以上是為什麼不能在 C 中使用循環變數作為模板參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!