在 C 中,模板參數必須是常數表達式。這意味著它們的值必須在編譯時已知。編譯器無法在此上下文中計算非常量變數。
考慮以下程式碼:
<code class="cpp">template <int a> void modify(){}</code>
要傳遞非常量變數作為範本參數,我們可以寫:
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
但是,這會觸發錯誤,因為編譯器無法在編譯時決定i 的值。循環體可能會執行多次,改變i的值。
我們可以使用模板特化來實現,而不是直接傳遞非常量變量迭代調用:
<code class="cpp">#include <iostream> template<> void modify<0>() { std::cout << "modify<0>" << std::endl; } template<> void modify<1>() { std::cout << "modify<1>" << std::endl; } // ... template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; modify<i+1>(); } int main() { modify<0>(); }</code>
要使用編譯時未知的值呼叫修改,我們可以使用稱為模板元程式設計的技術。這是一個簡化的範例:
<code class="cpp">#include <tuple> template <std::tuple<int...>> struct TupleSize; template <int... Args> struct TupleSize<std::tuple<Args...>> { static const int value = sizeof...(Args); }; template <int N> void callModify(int i) { if constexpr (i < N) { modify<i>(); callModify<N>(i+1); } } int main() { int n = 10; callModify<TupleSize<std::make_tuple(1,2,3,4,5,6,7,8,9,10)>::value>(0); }</code>
在此範例中,callModify 採用參數 N,該參數是包含 i 所需值範圍的元組的大小。此函數使用遞歸元程序產生呼叫以修改至指定大小 N。
以上是為什麼非常量變數不能用作 C 中的模板參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!