Bagaimanakah anda memanggil fungsi pada argumen templat variadic dalam C ?

DDD
Lepaskan: 2024-11-10 22:02:03
asal
157 orang telah melayarinya

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

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

Penyelesaian Pra-C 17

Sebelum C 17 , pendekatan biasa melibatkan penggunaan pemula senarai dengan jenis pulangan yang tidak batal dengan sengaja:

{ print(Args)... }
Salin selepas log masuk

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

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

Untuk mengurangkan potensi peruntukan tatasusunan besar, struct tersuai boleh digunakan:

namespace so {
    struct expand_type {
        template <typename... T>
        expand_type(T&amp;&amp;...) {}
    };
}
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan