ホームページ  >  記事  >  バックエンド開発  >  パックされた可変個引数テンプレートの引数リストを簡潔に反復するにはどうすればよいでしょうか?

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-24 03:28:30900ブラウズ

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 以降では、フォールド式をラムダ関数とともに利用して反復を実現できます。ラムダは、カウンターのインクリメントや現在の引数の出力など、ループ内で任意の操作を実行できます。

<code class="cpp">template <class ... Ts>
void Foo (Ts &amp;&amp; ... inputs)
{
    int i = 0;

    ([&amp;]
    {
        // Do things in your &quot;loop&quot; lambda

        ++i;
        std::cout << &quot;input &quot; << i << &quot; = &quot; << inputs << std::endl;

    } (), ...);
}</code>

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

代替案ループ ブレークの処理

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

  • try/throw の使用: このアプローチでは、ラムダ内で例外をスローしてループを抜け出すことができます。ただし、この方法は、例外のオーバーヘッドによりパフォーマンスに大きな影響を与える可能性があります。
  • 変数/if スイッチ: このアプローチには、ループを制御する変数の作成とループから抜け出すための if ステートメントの使用が含まれます。ループ。効果的ではありますが、見た目があまり美しくないコードになる可能性があります。

以上がパックされた可変個引数テンプレートの引数リストを簡潔に反復するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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