はじめに
可変個引数テンプレートを使用すると、引数の可変数。ただし、これらの引数を反復処理するのは困難な場合があります。この記事では、フォールド式を使用した包括的なソリューションを含む、パックされた可変長引数テンプレート引数リストを反復処理する方法について説明します。
方法 1: 同種の型入力を反復処理する
入力がすべて同じ型の場合、マクロまたはラムダ関数を使用してそれらをループできます。例:
<code class="cpp">#include <iostream> #define FOREACH_INPUT(...) (([](auto &&... inputs) { for (auto input : { __VA_ARGS__ }) { std::cout << input << std::endl; } })(inputs))
使用法:
<code class="cpp">FOREACH_INPUT(1, 2, 3, 4, 5);
方法 2: 式の折り畳み (>= C 17) 混合の場合型入力、フォールド式は、簡潔で強力なアプローチを提供します。次の例を考えてみましょう。 Break/Return を使用した拡張 Fold Expression ループ内で Break または Return が必要な場合は、次の回避策を検討してください。 以上がC でパックされた可変個引数テンプレート引数リストを効果的に反復処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。<code class="cpp">#include <iostream>
#include <utility>
template <class ... Ts>
void Foo (Ts &&... inputs)
{
int i = 0;
([&]
{
std::cout << "input " << ++i << " = " << inputs << std::endl;
} (), ...);
}
int main()
{
Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
}</code>
<code class="cpp">#include <iostream>
#include <utility>
template <class ... Ts>
void Foo (Ts &&... inputs)
{
int i = 0;
try {
([&]
{
std::cout << "input " << ++i << " = " << inputs << std::endl;
if (inputs == 'a') throw 1;
} (), ...);
} catch (...) {
}
}
int main()
{
Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
}</code>
<code class="cpp">#include <iostream>
#include <utility>
template <class ... Ts>
void Foo (Ts &&... inputs)
{
int i = 0;
bool exit = false;
auto process_input = [&](auto &&input) mutable {
if (input == 'a') {
std::cout << "Found 'a'. Breaking loop." << std::endl;
exit = true;
return;
}
std::cout << "input " << ++i << " = " << input << std::endl;
};
(process_input(inputs), ...);
if (!exit)
std::cout << "Finished looping through all inputs." << std::endl;
}
int main()
{
Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
}</code>