首页 > 后端开发 > C++ > 如何在 C 中有效地迭代打包的可变参数模板参数列表?

如何在 C 中有效地迭代打包的可变参数模板参数列表?

Barbara Streisand
发布: 2024-10-23 18:21:59
原创
562 人浏览过

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

迭代打包的可变参数模板参数列表

简介

可变参数模板允许您创建可以使用参数数量可变。然而,迭代这些论点可能具有挑战性。本文探讨了迭代打包可变参数模板参数列表的方法,包括使用折叠表达式的综合解决方案。

方法 1:迭代同质类型输入

如果您的输入都是相同的类型,您可以使用宏或 lambda 函数来循环它们。例如:

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

#define FOREACH_INPUT(...) (([](auto &&... inputs) { for (auto input : { __VA_ARGS__ }) { std::cout << input << std::endl; } })(inputs))</code>
登录后复制

用法:

<code class="cpp">FOREACH_INPUT(1, 2, 3, 4, 5);</code>
登录后复制

方法 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>
登录后复制

带有中断/返回的增强折叠表达式

如果您的循环中需要中断或返回,请考虑以下解决方法:

  • 尝试/抛出:
<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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板