ホームページ >バックエンド開発 >C++ >C でパックされた可変個引数テンプレート引数リストを効果的に反復処理する方法

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-23 18:21:59575ブラウズ

How to Effectively Iterate Over Packed Variadic Template Argument Lists in C  ?

パックされた可変個引数テンプレートの引数リストの反復

はじめに

可変個引数テンプレートを使用すると、引数の可変数。ただし、これらの引数を反復処理するのは困難な場合があります。この記事では、フォールド式を使用した包括的なソリューションを含む、パックされた可変長引数テンプレート引数リストを反復処理する方法について説明します。

方法 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)

混合の場合型入力、フォールド式は、簡潔で強力なアプローチを提供します。次の例を考えてみましょう。

<code class="cpp">#include <iostream>
#include <utility>

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

    ([&amp;]
    {
        std::cout << "input " << ++i << " = " << inputs << std::endl;
    } (), ...);
}

int main()
{
    Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
}</code>

Break/Return を使用した拡張 Fold Expression

ループ内で Break または Return が必要な場合は、次の回避策を検討してください。

  • 試行/スロー:
<code class="cpp">#include <iostream>
#include <utility>

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

    try {
        ([&amp;]
        {
            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>
  • 変数/If スイッチ:
<code class="cpp">#include <iostream>
#include <utility>

template <class ... Ts>
void Foo (Ts &&... inputs)
{
    int i = 0;
    bool exit = false;

    auto process_input = [&amp;](auto &amp;&amp;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>

以上がC でパックされた可変個引数テンプレート引数リストを効果的に反復処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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