首页 > 后端开发 > C++ > 我们如何简洁地迭代打包的可变参数模板参数列表?

我们如何简洁地迭代打包的可变参数模板参数列表?

Linda Hamilton
发布: 2024-10-24 03:28:30
原创
990 人浏览过

How Can We Iterate Over a Packed Variadic Template Argument List Concisely?

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

在 C 中,迭代打包可变参数模板参数列表会带来挑战,因为无法知道参数的数量并从中单独检索数据。在构造函数时使用宏进一步加剧了这个问题,这阻止了递归调用。

为了解决这个问题,提供的解决方案采用了自定义类型any,它可以保存不同类型的数据。通过将此类型传递给可变参数模板,参数将扩展为任何对象的向量。随后,可以使用专门的 getter 函数 (get()) 检索该向量的各个元素,从而允许对不同类型的数据进行迭代。

虽然此方法可以完成任务,但它确实需要详细函数调用,例如 foo(arg(1000))。为了简化这一点,我们寻求一种更简洁的迭代方法或等效于 std::get() 的打包可变参数模板参数列表。

使用 STL 折叠表达式和 Lambda 的解决方案

对于 C 17 及更高版本,折叠表达式可以与 lambda 函数一起使用来实现迭代。 lambda 可以在循环内执行任意操作,包括递增计数器和打印当前参数:

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

    ([&amp;]
    {
        // Do things in your &quot;loop&quot; lambda

        ++i;
        std::cout << &quot;input &quot; << i << &quot; = &quot; << inputs << std::endl;

    } (), ...);
}</code>
登录后复制

此方法提供了更简洁易读的迭代机制。

替代方案处理循环中断

虽然上述解决方案完成了任务,但它缺乏在循环内实现中断或返回的能力。为了解决这个问题,我们可以利用诸如以下的解决方法:

  • 使用 try/throw: 在这种方法中,我们可以在 lambda 中抛出异常来跳出循环。然而,由于异常的开销,此方法会显着影响性能。
  • 变量/if 开关: 这种方法涉及创建一个变量来控制循环并使用 if 语句来中断循环。虽然有效,但它可能会导致代码不太美观。

以上是我们如何简洁地迭代打包的可变参数模板参数列表?的详细内容。更多信息请关注PHP中文网其他相关文章!

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