Bagaimana untuk Menguatkuasakan Keseragaman Jenis dalam Fungsi Variadic?

Barbara Streisand
Lepaskan: 2024-11-10 04:30:02
asal
283 orang telah melayarinya

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

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

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

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!

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