Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Memastikan Kehomogenan Jenis Hujah dalam Fungsi Variadik?
Apabila mentakrifkan fungsi dengan argumen variadic, selalunya wajar untuk memastikan semua argumen yang disediakan adalah daripada jenis yang sama . Ini membantu mengekalkan keselamatan jenis dan menghalang kemungkinan ralat.
Fungsi variadik sendiri tidak menguatkuasakan keselamatan jenis, menjadikan pengaturcara bertanggungjawab untuk semakan eksplisit. Walau bagaimanapun, gabungan teknik boleh digunakan untuk melaksanakan keperluan ini dengan berkesan.
Pilihan 1: Pendekatan Tukar-Kemudian
Salah satu kaedah ialah menerima hujah sebagai variadic dan lakukan penukaran jenis kemudian. Sebagai contoh, jika anda mengetahui langkah-langkah yang diperlukan untuk menukar daripada std::array kepada dragon_list_t, fungsi templat berikut boleh digunakan:
template<typename ...Items> dragon_list_t make_dragon_list(Items... maidens) { std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }}; // Here be dragons }
Pilihan 2: Pendekatan Awal-Penolakan Berasaskan SFINAE
Pilihan lain ialah menggunakan Kegagalan Gantian Bukan Ralat (SFINAE) untuk melakukan semakan jenis pada tahap antara muka fungsi. Teknik ini membenarkan penyelesaian beban lampau untuk menolak jenis hujah yang tidak sah lebih awal:
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 contoh ini, fungsi f akan digunakan hanya apabila semua argumen yang disediakan boleh ditukar kepada jenis ToType.
Kesimpulan
Dengan menggunakan sama ada pendekatan tukar-kemudian atau pendekatan tolak-awal berasaskan SFINAE, pembangun boleh menentukan satu jenis untuk semua hujah yang dihantar kepada fungsi variadic atau fungsi templat variadic tanpa menggunakan kepada struktur tambahan atau overhed.
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Kehomogenan Jenis Hujah dalam Fungsi Variadik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!