Cara Menggulung Pada Pek Parameter Menggunakan Pengembangan Pek
Apabila menggunakan templat dan fungsi variadic, adalah penting untuk memahami penggunaan pek pengembangan. Pertimbangkan kod berikut:
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); }
Setelah disusun, kod ini gagal dengan ralat:
Error C3520: 'args': parameter pack must be expanded in this context
Penyelesaian: Pengembangan Pek dalam Braced-Init-List
Untuk menangani isu ini, anda boleh menggunakan pengembangan pek dalam a braced-init-list:
template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
Memahami Braced-Init-List
Senarai pemula dalam definisi tatasusunan mengembangkan pengembangan pek menjadi dipisahkan koma senarai. Cast to void memastikan bahawa operator koma yang digunakan ialah yang terbina dalam dan bukannya versi yang terlebih muatan. Ini menjamin penilaian kiri ke kanan pengembangan pek.
Pilihan Tambahan dengan C 17
Dalam C 17, anda boleh memudahkan kod menggunakan lipatan ungkapan:
((void) bar(std::forward<Args>(args)), ...);
Kesimpulan
Dengan menggunakan pengembangan pek dalam senarai init-braced atau ungkapan lipatan dalam C 17, anda boleh gelung dengan berkesan pada pek parameter dan elakkan ralat penyusunan. Memahami teknik ini adalah penting untuk bekerja dengan templat dan fungsi variadik dalam C .
Atas ialah kandungan terperinci Bagaimana untuk Menggelung dengan Betul Pada Pek Parameter dalam Templat Variadik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!