嘗試將非常量變數作為模板參數傳遞時(例如以下程式碼片段中的i),編譯器會出現問題錯誤:
<code class="cpp">template <int a> void modify() {} for (int i = 0; i < 10; i++) { modify<i>(); // error: 'i' cannot appear in constant-expression }</code>
錯誤原因:
模板在編譯期間擴展,這需要在編譯時評估其參數。由於 i 在迴圈內被修改,編譯器無法在編譯時確定其值,導致錯誤。
替代實作:
無需實現所需的迭代更改API 接口,請考慮實現以下內容:
<code class="cpp">#include <iostream> template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; } template<int x, int to> struct static_for { void operator()() { modify<x>(); static_for<x+1,to>()(); } }; template<int to> struct static_for<to,to> { void operator()() {} }; int main() { static_for<0,10>()(); }</code>
此版本利用遞歸來模擬迭代。透過為每個值實例化專門的模板函數(例如,modify、modify 等),程式碼模擬從 i=0 到 i=9 的循環行為。
Non - 常數模板參數解析:
要使用可變參數VAR(由函數計算確定)呼叫修改,請考慮使用具有可變參數的模板函數,如下:
<code class="cpp">template <typename T> void modify(const T& x) { std::cout << "modify(" << x << ")" << std::endl; } int main() { auto VAR = ...; // computed from some functional process modify(VAR); }</code>
以上是為什麼我不能在 C 中使用非常量變數作為模板參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!