テンプレート引数定数の評価
1.コンパイラがコンパイル時に 'i' を評価できないのはなぜですか?
コンパイル時の評価では、プログラムの実行前に 'i' の値がわかっている必要があります。ただし、提供されたコードでは、「i」はプログラムの実行中に変更されるループ変数です。 'i' は動的に割り当てられる値であるため、コンパイラはコンパイル時に 'i' の値を決定できません。
2. API インターフェイスを変更せずに目的を達成できますか?
はい、テンプレートの特殊化を使用して、テンプレート引数の範囲を反復処理する再帰関数を作成できます。たとえば、次の関数を作成できます。
<code class="cpp">template<int i> void modify_recursive() { // Call modify with template argument 'i' modify<i>(); // Recursively call modify_recursive with the next template argument if (i < 10) { modify_recursive<i + 1>(); } }</code>
非定数引数を使用して 'modify' を呼び出す
次の値を使用して 'modify' を呼び出すコンパイル時の定数ではない場合は、テンプレート メタプログラミングと呼ばれる手法を使用できます。 1 つのアプローチは、関数オブジェクトを引数として受け取り、目的の値でそれを呼び出すテンプレート クラスを作成することです:
<code class="cpp">template<typename F> struct InvokeWithParam { InvokeWithParam(F f, int param) : f(f), param(param) {} void operator()() { f(param); } F f; int param; };</code>
その後、InvokeWithParam のインスタンスをテンプレート引数として渡して変更できます:
<code class="cpp">int var = 5; modify<InvokeWithParam{modify, var}>();</code>
これにより、var.
の値を使用して変更関数が呼び出されます。以上がコンパイル時に引数が不明な場合、テンプレート引数を使用して一定の評価を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。