「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > コンパイル時に引数が不明な場合、テンプレート引数を使用して一定の評価を実現するにはどうすればよいですか?

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

2024 年 11 月 20 日に公開
ブラウズ:121

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 インターフェイスを変更せずに目的を達成できますか?

はい、テンプレートの特殊化を使用して、テンプレート引数の範囲を反復処理する再帰関数を作成できます。たとえば、関数:

template
void modify_recursive() {
    // Call modify with template argument 'i'
    modify();
    
    // Recursively call modify_recursive with the next template argument
    if (i ();
    }
}

定数以外の引数を使用して 'modify' を呼び出す

コンパイル時定数ではない値を使用して 'modify' を呼び出すには、テンプレートメタプログラミングと呼ばれる手法。 1 つのアプローチは、関数オブジェクトを引数として受け取り、それを目的の値で呼び出すテンプレート クラスを作成することです。

template
struct InvokeWithParam {
    InvokeWithParam(F f, int param) : f(f), param(param) {}
    
    void operator()() { f(param); }
    
    F f;
    int param;
};

次に、InvokeWithParam のインスタンスをテンプレート引数として渡して変更します。

int var = 5;
modify();

これは、var.

の値を使用して変更関数を呼び出します。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3