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
Mary-Kate Olsenasal
2024-12-24 10:59:13504semak imbas

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;    
}

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) ... };
}

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.

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:
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