Bagaimanakah SFINAE boleh digunakan untuk mencipta ciri jenis untuk mengenal pasti bekas STL dalam C ?

Barbara Streisand
Lepaskan: 2024-10-26 12:00:29
asal
139 orang telah melayarinya

How can SFINAE be used to create a type trait for identifying STL containers in C  ?

Ciri Jenis untuk Mengenalpasti Bekas STL

Dalam C , ciri jenis boleh digunakan untuk menentukan sifat bagi jenis tertentu. Satu keperluan biasa ialah untuk menyemak sama ada jenis mewakili bekas, seperti vektor, set atau peta.

Pelaksanaan Tersuai untuk Vektor

Untuk bermula, mari kita mulakan pertimbangkan untuk mencipta ciri jenis khusus untuk vektor. Walau bagaimanapun, percubaan berikut gagal untuk menyusun:

<code class="cpp">template<class T, typename Enable = void>
struct is_vector {
  static bool const value = false;
};

template<class T, class U>
struct is_vector<T, typename boost::enable_if<boost::is_same<T, std::vector<U>> >::type> {
  static bool const value = true;
};</code>
Salin selepas log masuk

Kod ini menjana ralat "parameter templat tidak digunakan dalam pengkhususan separa: U." Ini kerana parameter templat U tidak digunakan dalam pengkhususan separa.

Penyelesaian Berasaskan SFINAE untuk Bekas

Pendekatan yang lebih umum ialah menggunakan Kegagalan Penggantian Bukan Bukan Ralat (SFINAE) untuk mencipta ciri jenis yang berfungsi untuk pelbagai bekas STL. Berikut ialah contoh:

<code class="cpp">template<typename T, typename _ = void>
struct is_container : std::false_type {};

template<typename... Ts>
struct is_container_helper {};

template<typename T>
struct is_container<
        T,
        std::conditional_t<
            false,
            is_container_helper<
                typename T::value_type,
                typename T::size_type,
                typename T::iterator,
                typename T::const_iterator,
                decltype(std::declval<T>().size()),
                decltype(std::declval<T>().begin()),
                decltype(std::declval<T>().end()),
                decltype(std::declval<T>().cbegin()),
                decltype(std::declval<T>().cend())
                >,
            void
            >
        > : public std::true_type {};</code>
Salin selepas log masuk

Ciri jenis ini menyemak kehadiran ahli penting dan kaedah yang biasa kepada kebanyakan bekas STL. Jika semua ahli ini hadir, is_container menilai kepada benar; jika tidak, ia menilai kepada palsu.

Nota: Untuk memastikan ciri jenis hanya mengenal pasti bekas STL, anda mungkin perlu melaraskan semakan untuk mengesahkan keperluan khusus yang lazim bagi bekas STL.

Atas ialah kandungan terperinci Bagaimanakah SFINAE boleh digunakan untuk mencipta ciri jenis untuk mengenal pasti bekas STL dalam C ?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!