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>このアプローチは、デフォルト値を 1 に設定したテンプレート関数modify_loopから始まります。関数内では、現在のI値でmodifyを呼び出し、その後、Iを使用してそれ自体を再帰的に呼び出します。増加しました。再帰は、目的の値 10 に達するまで続きます。関数出力を使用した Modify の呼び出しVAR が関数計算の出力である場合に Modify を呼び出すには、式テンプレート
。以下に例を示します。
この例では、Func 構造体は、引数に 10 を加算する関数オブジェクトを定義します。 VAR 変数はこの関数の出力を保存し、modify 関数は任意の型のテンプレート引数を受け入れます。 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>
以上がC でループ変数をテンプレート引数として使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。