Memanggil Fungsi pada Argumen Templat Variadik
Dalam C , seseorang mungkin ingin mereka bentuk fungsi yang boleh beroperasi dengan lancar pada nombor arbitrari hujah pelbagai jenis. Walaupun pengkhususan templat rekursif membenarkan kefungsian sedemikian, ia menghasilkan sejumlah besar kod berlebihan. Untuk menangani isu ini, pendekatan yang lebih cekap dicari.
Penyelesaian Ungkapan Lipatan C 17
Dalam C 17, penyelesaian mudah disediakan oleh ungkapan lipatan:
(f(args), ...);
Ungkapan ini memudahkan seruan f secara berurutan pada setiap hujah dalam pek variadic args. Walau bagaimanapun, jika f mengembalikan objek dengan pengendali koma yang terlebih beban, sintaks berikut harus digunakan:
((void)f(args), ...);
Penyelesaian Pra-C 17
Sebelum C 17 , pendekatan biasa melibatkan penggunaan pemula senarai dengan jenis pulangan yang tidak batal dengan sengaja:
{ print(Args)... }
Walau bagaimanapun, ini memerlukan pembalut ungkapan dalam pembolehubah yang tidak digunakan untuk mengelakkan ralat penyusunan disebabkan oleh jenis cetakan pulangan batal :
using expand_type = int[]; expand_type{ (print(Args), 0)... };
Untuk meningkatkan kebolehgunaan semula corak ini, makro boleh ditakrifkan:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... } SO_EXPAND_SIDE_EFFECTS(print(Args));
Untuk mengurangkan potensi peruntukan tatasusunan besar, struct tersuai boleh digunakan:
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
Atas ialah kandungan terperinci Bagaimanakah anda memanggil fungsi pada argumen templat variadic dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!