パックされた可変個引数テンプレート引数リストを反復処理する方法
C では、パックされた可変個引数テンプレート引数リストを反復処理すると、次のような問題が発生します。引数の数を知り、それらから個別にデータを取得することができない。この問題は、再帰呼び出しを妨げる関数の構築時にマクロを使用することによってさらに悪化します。
これに対処するために、提供されるソリューションでは、さまざまな種類のデータを保持できるカスタム タイプ any を採用しています。この型を可変長引数テンプレートに渡すことにより、引数は任意のオブジェクトのベクトルに展開されます。その後、特殊なゲッター関数 (get
このメソッドはタスクを実行しますが、次のことが必要です。 foo(arg(1000)) などの冗長な関数呼び出し。これを単純化するために、より簡潔な反復メソッド、またはパックされた可変長引数テンプレート引数リストの std::get() と同等のメソッドを模索します。
STL Fold Expressions と Lambda を使用したソリューション
C 17 以降では、フォールド式をラムダ関数とともに利用して反復を実現できます。ラムダは、カウンターのインクリメントや現在の引数の出力など、ループ内で任意の操作を実行できます。
<code class="cpp">template <class ... Ts> void Foo (Ts && ... inputs) { int i = 0; ([&] { // Do things in your "loop" lambda ++i; std::cout << "input " << i << " = " << inputs << std::endl; } (), ...); }</code>
このメソッドは、より簡潔で読みやすい反復メカニズムを提供します。
代替案ループ ブレークの処理
前述のソリューションはタスクを達成しますが、ループ内でブレークやリターンを実装する機能がありません。これに対処するには、次のような回避策を利用できます:
以上がパックされた可変個引数テンプレートの引数リストを簡潔に反復するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。