パックされた可変個引数テンプレート引数リストを反復処理する方法
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;
} (), ...);
}
このメソッドは、より簡潔で読みやすい反復メカニズムを提供します。
ループ ブレークに対処するための代替案
前述のソリューションはタスクを達成しますが、ループ内でブレークやリターンを実装する機能がありません。これに対処するには、
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3