Dalam C , selalunya wajar untuk mengulangi argumen templat variadic dan melaksanakan operasi tertentu, seperti memanggil sesuatu fungsi. Ini boleh dicapai menggunakan sama ada:
(f(args), ...);
Walau bagaimanapun, jika fungsi yang dipanggil berpotensi mengembalikan objek dengan pengendali koma yang terlebih beban, anda harus menggunakan:
((void)f(args), ...);
Pendekatan biasa ialah memanfaatkan permulaan senarai dan melakukan pengembangan di dalamnya:
{ print(Args)... }
Memandangkan cetakan() mengembalikan tidak sah, anda boleh atasi masalah dengan mengembalikan int:
{ (print(Args), 0)... }
Untuk memastikan ini berfungsi dengan sebarang bilangan argumen, anda boleh menjadikan pek sentiasa mempunyai sekurang-kurangnya satu elemen:
{ 0, (print(Args), 0)... }
Anda boleh merangkum corak ini menjadi makro yang boleh diguna semula:
namespace so { using expand_type = int[]; } #define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }
Untuk mengendalikan operator koma yang terlebih beban, anda boleh mengubah suai makro:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) \ ::so::expand_type{ 0, ((PATTERN), void(), 0)... }
Jika anda bimbang tentang peruntukan memori yang tidak perlu, anda boleh menentukan jenis tersuai yang menyokong permulaan senarai tetapi tidak menyimpan data:
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
Atas ialah kandungan terperinci Bagaimana untuk Menggunakan Fungsi pada Semua Argumen Templat Variadic dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!