Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menguatkuasakan Keseragaman Jenis dalam Fungsi Variadic?

Bagaimana untuk Menguatkuasakan Keseragaman Jenis dalam Fungsi Variadic?

Barbara Streisand
Barbara Streisandasal
2024-11-10 04:30:02268semak imbas

How to Enforce Type Uniformity in Variadic Functions?

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. Anda kemudian boleh menggunakan sebarang kaedah yang tersedia untuk menukar tatasusunan ini kepada jenis dragon_list_t anda.

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!

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