ホームページ >バックエンド開発 >C++ >C でループ変数をテンプレート引数として使用できないのはなぜですか?

C でループ変数をテンプレート引数として使用できないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-31 01:09:02494ブラウズ

 Why Can't I Use a Loop Variable as a Template Argument in C  ?

テンプレート引数が定数である必要がある理由

C では、コンパイラがコンパイル中にその値を決定する必要があるため、テンプレート引数は定数式に制限されています。定数式とは、変数や関数呼び出しを除き、コンパイル時に利用可能な情報のみに基づいて評価できる式です。

エラーの説明

提供されたコード内:

<code class="cpp">for(int i = 0; i < 10; i++) {
    modify<i>();
}</code>

テンプレート引数 i は、その値が実行時に評価されるループ カウンター変数に依存するため、定数式ではありません。したがって、コンパイラはコンパイル時に i の値を決定できず、エラーが発生します。

API を変更しない代替アプローチ

ライブラリ インターフェイスを変更せずに目的を達成するには、テンプレートメタプログラミング。アプローチは次のとおりです。

<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。