ホームページ  >  記事  >  バックエンド開発  >  コンパイル時に引数が不明な場合、テンプレート引数を使用して一定の評価を実現するにはどうすればよいですか?

コンパイル時に引数が不明な場合、テンプレート引数を使用して一定の評価を実現するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-03 10:05:291006ブラウズ

How Can I Achieve Constant Evaluation with Template Arguments When the Argument Is Not Known at Compile Time?

テンプレート引数定数の評価

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

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