Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengulangi Pek Parameter dalam C Menggunakan Pengembangan Pek?

Bagaimanakah Saya Boleh Mengulangi Pek Parameter dalam C Menggunakan Pengembangan Pek?

Mary-Kate Olsen
Lepaskan: 2024-12-24 10:59:13
asal
567 orang telah melayarinya

How Can I Iterate Over a Parameter Pack in C   Using Pack Expansion?

Templat Variadik: Membongkar Pengembangan Pek untuk Lelaran

Templat variadik memberikan ekspresi yang luar biasa dalam C , tetapi menerokai bidangnya boleh mendedahkan kerumitan yang tidak dijangka. Satu cabaran sedemikian timbul apabila cuba untuk mengulangi pek parameter menggunakan pengembangan pek. Pertimbangkan kod berikut:

template<typename T>
static void bar(T t) {}

template<typename... Args>
static void foo2(Args... args)
{
    (bar(args)...);
}

int main()
{
    foo2(1, 2, 3, "3");
    return 0;    
}
Salin selepas log masuk

Setelah disusun, kod ini menghadapi ralat: "'args': pek parameter mesti dikembangkan dalam konteks ini." Isu ini berpunca daripada ketidakupayaan untuk mengembangkan pek parameter secara langsung dalam panggilan fungsi.

Penyelesaian terletak pada menggunakan pengembangan pek dalam senarai init-braced, konteks yang secara eksplisit membenarkan pengembangan sedemikian. Dengan meletakkan pengembangan di dalam senarai pemula tatasusunan dummy, kita boleh memaksa tingkah laku yang diingini:

template<typename... Args>
static void foo2(Args &amp;&amp;... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}
Salin selepas log masuk

Kod yang disemak ini merangkumi pendekatan yang teliti untuk memastikan penilaian yang betul:

  • Berjaga-jaga Terhadap Pengembangan Kosong: Args kosong akan menghasilkan tatasusunan 0-panjang, yang menyalahi undang-undang dalam C . Untuk mengelakkan ini, kami memastikan tatasusunan mengandungi sekurang-kurangnya satu elemen.
  • Pemajuan Sempurna: Kami menggunakan pemajuan sempurna (std::forward) untuk mengelakkan kemungkinan salinan dan mengekalkan kelayakan yang berpotensi const.
  • Meneutralkan Jenis Pulangan: Kami menghantar nilai pulangan bar() kepada batal kepada memanfaatkan pengendali koma terbina dalam, memastikan penilaian kiri ke kanan.

Dalam C 17, ekspresi lipatan memberikan penyelesaian yang lebih padat:

((void) bar(std::forward<Args>(args)), ...);
```

This approach guarantees the desired left-to-right expansion unequivocally.
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengulangi Pek Parameter dalam C Menggunakan Pengembangan Pek?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan