Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menggelung dengan Betul Pada Pek Parameter dalam Templat Variadik?

Bagaimana untuk Menggelung dengan Betul Pada Pek Parameter dalam Templat Variadik?

Patricia Arquette
Patricia Arquetteasal
2024-12-27 16:42:10580semak imbas

How to Correctly Loop Over a Parameter Pack in Variadic Templates?

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!

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