Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Menguatkuasakan Keseragaman Jenis dalam Fungsi Variadic?
Memastikan Keseragaman Jenis Argumen dalam Fungsi Variadik
Dalam senario ini, kami berhasrat untuk mencipta fungsi yang boleh menerima bilangan argumen yang berubah-ubah, tetapi pastikan semua hujah adalah daripada jenis yang sama. Kami berusaha untuk mencapai ini tanpa menggunakan struktur data tambahan seperti tatasusunan atau vektor.
Fungsi Variadik
Fungsi variadik dengan sendirinya tidak memberikan keselamatan jenis untuk hujahnya. Untuk menguatkuasakan keseragaman jenis, pertimbangkan untuk menggunakan fungsi templat variadik.
Fungsi Templat Variadik
Fungsi templat variadik boleh ditakrifkan seperti berikut:
template<typename... Args> return_type function_name(Args...);
Dalam templat ini, Args... mewakili bilangan pembolehubah argumen yang boleh dihantar ke fungsi.
Penguatkuasaan Pemeriksaan Jenis
Untuk menjamin bahawa semua hujah adalah daripada jenis yang sama, kami boleh menggunakan SFINAE (Kegagalan Penggantian Bukan Ralat). SFINAE membenarkan kami membuat templat yang mengesan sama ada keadaan yang diberikan adalah benar atau palsu semasa penyusunan.
Berikut ialah contoh:
template<typename R, typename... Args> struct fst { typedef R type; }; template<typename ...Args> typename fst<void, typename enable_if< is_convertible<Args, ToType>::value >::type... >::type f(Args...);
Dalam templat ini, f() hanya akan dibenarkan untuk menerima hujah yang boleh ditukar kepada jenis ToType (yang mewakili jenis hujah yang diingini). Konfigurasi ini menolak sebarang hujah yang tidak boleh ditukar kepada ToType.
Gunakan Penyelesaian Kes
Untuk kes penggunaan khusus anda, anda boleh menggunakan yang berikut:
template<typename ...Items> dragon_list_t make_dragon_list(Items... maidens) { std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }}; // here be dragons }
Templat ini menukar argumen pembolehubah menjadi tatasusunan jenis std::array
Gabungan dengan SFINAE
Menggabungkan pendekatan ini dengan teknik SFINAE yang diterangkan sebelum ini, anda boleh mencipta templat yang menolak sebarang hujah yang tidak boleh ditukar kepada Maiden.
Atas ialah kandungan terperinci Bagaimana untuk Menguatkuasakan Keseragaman Jenis dalam Fungsi Variadic?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!