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>
コンパイル時に不明な値を使用して Modify を呼び出すには、テンプレート メタプログラミングと呼ばれる手法を使用できます。簡略化した例を次に示します。
<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 は、i に必要な値の範囲を含むタプルのサイズであるパラメーター N を受け取ります。この関数は再帰的メタプログラムを使用して、指定されたサイズ N まで変更する呼び出しを生成します。
以上がC で非定数変数をテンプレート引数として使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。