Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menguatkuasakan Jenis Hujah Tunggal untuk Fungsi atau Templat Variadik Tanpa Menggunakan Bekas?

Bagaimana untuk Menguatkuasakan Jenis Hujah Tunggal untuk Fungsi atau Templat Variadik Tanpa Menggunakan Bekas?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-12 00:11:03933semak imbas

How to Enforce a Single Argument Type for Variadic Functions or Templates Without Using Containers?

Menentukan Jenis Argumen Tunggal untuk Fungsi Variadik atau Templat Tanpa Bekas

Apabila bekerja dengan fungsi variadik atau fungsi templat, adalah wajar untuk pastikan semua hujah mematuhi jenis tertentu, sambil menunjukkan ralat masa kompilasi yang jelas apabila salah penggunaan.

Fungsi Variadik

Fungsi variadik, seperti keluarga printf, menerima pembolehubah bilangan argumen yang berbeza-beza jenis. Walau bagaimanapun, ia tidak mempunyai keselamatan jenis, menjadikannya sukar untuk menguatkuasakan jenis tertentu untuk semua hujah.

Fungsi Templat Variadik

Fungsi templat variadik boleh menyediakan keselamatan jenis melalui jenis templat parameter. Walau bagaimanapun, menetapkan tatasusunan atau vektor jenis yang dikehendaki dalam parameter templat menambahkan kerumitan yang tidak perlu pada tandatangan fungsi.

Penyelesaian: Pengaturcaraan Meta Templat (SFINAE)

Untuk mencapai taip penguatkuasaan tanpa menggunakan bekas, anda boleh memanfaatkan pemrograman meta templat dan teknik Kegagalan Penggantian Bukan Ralat (SFINAE). Berikut ialah contoh ringkas:

template<typename ToType, typename Arg>
struct is_convertible { static constexpr bool value = false; };

template<typename ToType, typename FromType>
struct is_convertible<ToType, FromType> : std::is_convertible<FromType, ToType> {};

template<typename ...Args>
void f(Args...) {
    // Check if all arguments are convertible to the desired type
    typename std::enable_if<
        is_convertible<ToType, Args>::value && ...
    >::type...;
}

Dalam contoh ini, metafungsi templat is_convertible menyemak sama ada setiap argumen boleh ditukar kepada jenis ToType. Fungsi f kemudian menggunakan SFINAE untuk mendayakan penggunaannya hanya jika semua argumen memenuhi syarat ini.

Penggunaan

Untuk menguatkuasakan kekangan jenis untuk fungsi make_dragon_list anda, anda boleh menggunakan SFINAE seperti berikut:

template<typename ToType, typename ...Args>
typename std::enable_if<
    is_convertible<ToType, Args>::value && ...
>::type
make_dragon_list(Args...);

Dengan pendekatan ini, pengkompil akan menolak sebarang percubaan untuk lulus hujah jenis yang salah, memberikan mesej ralat yang jelas dan awal.

Atas ialah kandungan terperinci Bagaimana untuk Menguatkuasakan Jenis Hujah Tunggal untuk Fungsi atau Templat Variadik Tanpa Menggunakan Bekas?. 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