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
Lepaskan: 2024-12-27 16:42:10
asal
579 orang telah melayarinya

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)...);
}
Salin selepas log masuk

Setelah disusun, kod ini gagal dengan ralat:

Error C3520: 'args': parameter pack must be expanded in this context
Salin selepas log masuk

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) ... };
}
Salin selepas log masuk

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)), ...);
Salin selepas log masuk

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!

sumber:php.cn
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