简介
可变参数模板允许您创建可以使用参数数量可变。然而,迭代这些论点可能具有挑战性。本文探讨了迭代打包可变参数模板参数列表的方法,包括使用折叠表达式的综合解决方案。
方法 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; ([&] { 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>
以上是如何在 C 中有效地迭代打包的可变参数模板参数列表?的详细内容。更多信息请关注PHP中文网其他相关文章!