Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengulangi Pek Parameter dalam C Menggunakan Pengembangan Pek?
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 &&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
Kod yang disemak ini merangkumi pendekatan yang teliti untuk memastikan penilaian yang betul:
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!