次のコード スニペットの 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<0>、modify<1> など) をインスタンス化することにより、コードは i=0 から i=9 までのループ動作をシミュレートします。
Non -定数テンプレート引数の解決:
変数引数 VAR (関数計算によって決定される) を使用して modify を呼び出すには、次のように可変引数パラメーターを持つテンプレート関数の使用を検討してください。
<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 中国語 Web サイトの他の関連記事を参照してください。