「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > パックされた可変個引数テンプレートの引数リストを簡潔に反復するにはどうすればよいでしょうか?

パックされた可変個引数テンプレートの引数リストを簡潔に反復するにはどうすればよいでしょうか?

2024 年 11 月 4 日に公開
ブラウズ:262

How Can We Iterate Over a Packed Variadic Template Argument List Concisely?

パックされた可変個引数テンプレート引数リストを反復処理する方法

C では、パックされた可変個引数テンプレート引数リストを反復処理すると、次のような問題が発生します。引数の数を知り、それらから個別にデータを取得することができない。この問題は、関数の構築時に再帰呼び出しを妨げるマクロを使用することによってさらに悪化します。

これに対処するために、提供されているソリューションでは、さまざまな種類のデータを保持できるカスタム タイプ any を採用しています。この型を可変長引数テンプレートに渡すことにより、引数は任意のオブジェクトのベクトルに展開されます。その後、特殊なゲッター関数 (get()) を使用してこのベクトルの個々の要素を取得でき、さまざまな種類のデータを反復処理できるようになります。

このメソッドはタスクを実行しますが、次のことが必要です。 foo(arg(1000)) などの冗長な関数呼び出し。これを単純化するために、より簡潔な反復メソッド、またはパックされた可変長引数テンプレート引数リストの std::get() と同等のメソッドを探します。

STL Fold Expressions と Lambda を使用した解決策

C 17 以降では、反復を実現するためにラムダ関数とともに折り畳み式を利用できます。ラムダは、カウンターのインクリメントや現在の引数の出力など、ループ内で任意の操作を実行できます:

template 
void Foo (Ts && ... inputs)
{
    int i = 0;

    ([&]
    {
        // Do things in your "loop" lambda

          i;
        std::cout << "input " << i << " = " << inputs << std::endl;

    } (), ...);
}

このメソッドは、より簡潔で読みやすい反復メカニズムを提供します。

ループ ブレークに対処するための代替案

前述のソリューションはタスクを達成しますが、ループ内でブレークやリターンを実装する機能がありません。これに対処するには、

  • try/throw を使用する: のような回避策を利用できます。このアプローチでは、ラムダ内で例外をスローしてループを抜け出すことができます。ただし、この方法は、例外のオーバーヘッドによりパフォーマンスに大きな影響を与える可能性があります。
  • 変数/if スイッチ: このアプローチには、ループを制御する変数の作成とループから抜け出すための if ステートメントの使用が含まれます。ループ。効果的ではありますが、コードがあまり美しくないものになる可能性があります。
リリースステートメント この記事は次の場所に転載されています: 1729667291 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

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

Copyright© 2022 湘ICP备2022001581号-3