Fungsi Memanggil pada Argumen Templat Variadic
Matlamatnya adalah untuk melaksanakan fungsi print() yang mengambil bilangan argumen yang berubah-ubah dan melaksanakan fungsi arbitrari pada setiap hujah. Ini dikehendaki sebagai alternatif padat kepada pelaksanaan rekursif dengan pengkhususan berasingan untuk setiap jenis hujah.
Penyelesaian C 17
Dalam C 17, ini boleh dicapai menggunakan ungkapan lipat:
(f(args), ...);
Ungkapan ini mengembangkan argumen dalam args dan memanggil f() pada setiap satu. Jika f() mengembalikan objek dengan pengendali koma yang terlebih beban, gunakan:
((void)f(args), ...);
Penyelesaian Pra-C 17
Untuk versi C sebelum C 17, pendekatan biasa ialah menggunakan pemula senarai untuk mengembangkan hujah:
{ print(Args)... }
Walau bagaimanapun, print() mengembalikan batal, jadi untuk mengelakkan ralat penyusunan, kod boleh diubah suai seperti yang ditunjukkan di bawah:
using expand_type = int[]; expand_type{ (print(Args), 0)... };
Ini berfungsi untuk hujah variadic, tetapi terdapat beberapa kaveat untuk dipertimbangkan. Untuk menjadikan corak ini boleh diguna semula, makro boleh dibuat:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }
Walau bagaimanapun, untuk mengelakkan potensi isu dengan pengendali koma terlampau beban, makro boleh dikemas kini seperti berikut:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), void(), 0)... }
Pra -Penyelesaian C 17 juga mungkin memerlukan pertimbangan tambahan untuk mengelakkan peruntukan memori yang tidak perlu.
Atas ialah kandungan terperinci Bagaimana untuk Memanggil Fungsi pada Argumen Templat Variadic dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!