Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah anda memanggil fungsi pada argumen templat variadic dalam C ?

Bagaimanakah anda memanggil fungsi pada argumen templat variadic dalam C ?

DDD
DDDasal
2024-11-10 22:02:03198semak imbas

How do you call a function on a variadic template arguments in C  ?

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&amp;&amp;...) {}
    };
}

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!

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