Pengenalan
Templat variadik membolehkan anda mencipta fungsi generik yang boleh mengambil bilangan hujah yang berubah-ubah. Walau bagaimanapun, mengulangi hujah tersebut boleh mencabar. Artikel ini meneroka kaedah untuk mengulangi senarai argumen templat variadic yang dibungkus, termasuk penyelesaian komprehensif menggunakan ungkapan lipatan.
Kaedah 1: Lelaran Atas Input Jenis Homogen
Jika input anda semuanya daripada jenis yang sama, anda boleh menggunakan fungsi makro atau lambda untuk mengulanginya. Contohnya:
<code class="cpp">#include <iostream> #define FOREACH_INPUT(...) (([](auto &&... inputs) { for (auto input : { __VA_ARGS__ }) { std::cout << input << std::endl; } })(inputs))
Penggunaan:
<code class="cpp">FOREACH_INPUT(1, 2, 3, 4, 5);
Kaedah 2: Ungkapan Lipat (>= C 17) Untuk campuran- input jenis, ekspresi lipatan menyediakan pendekatan yang ringkas dan berkuasa. Pertimbangkan contoh berikut: Ekspresi Lipatan Dipertingkatkan dengan Putus/Pulangan Jika anda memerlukan rehat atau pengembalian dalam gelung anda, pertimbangkan penyelesaian berikut: Atas ialah kandungan terperinci Bagaimana untuk Mengulangi Senarai Argumen Templat Variadik dengan Berkesan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!<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>